Use default logger
This commit is contained in:
parent
696076e131
commit
2c8bf1bb1f
@ -2,8 +2,8 @@ import xml.etree.ElementTree as eT
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
import astropy.units as u
|
import astropy.units as u
|
||||||
import os
|
import os
|
||||||
import logging
|
from ..lib.helpers import readCSV
|
||||||
from ..lib.helpers import error, readCSV
|
from ..lib.logger import logger
|
||||||
from .Entry import Entry
|
from .Entry import Entry
|
||||||
from ..classes import target as tg
|
from ..classes import target as tg
|
||||||
from ..classes import optical_component as oc
|
from ..classes import optical_component as oc
|
||||||
@ -37,10 +37,10 @@ class Configuration(object):
|
|||||||
|
|
||||||
# Check if configuration file exists
|
# Check if configuration file exists
|
||||||
if not os.path.exists(file):
|
if not os.path.exists(file):
|
||||||
error("Configuration file '" + file + "' doesn't exist.")
|
logger.error("Configuration file '" + file + "' doesn't exist.")
|
||||||
|
|
||||||
# Read configuration file
|
# Read configuration file
|
||||||
logging.info("Reading configuration from file '" + file + "'.")
|
logger.info("Reading configuration from file '" + file + "'.")
|
||||||
self.conf = self.__parser(eT.parse(file).getroot())
|
self.conf = self.__parser(eT.parse(file).getroot())
|
||||||
|
|
||||||
self.__check_config()
|
self.__check_config()
|
||||||
@ -105,53 +105,54 @@ class Configuration(object):
|
|||||||
"""
|
"""
|
||||||
# Check common
|
# Check common
|
||||||
if not hasattr(self.conf, "common"):
|
if not hasattr(self.conf, "common"):
|
||||||
error("Configuration check: Missing required container 'common'.")
|
logger.error("Configuration check: Missing required container 'common'.")
|
||||||
if not hasattr(self.conf.common, "wl_min"):
|
if not hasattr(self.conf.common, "wl_min"):
|
||||||
error("Configuration check: common: Missing required container 'wl_min'.")
|
logger.error("Configuration check: common: Missing required container 'wl_min'.")
|
||||||
mes = self.conf.common.wl_min.check_quantity("val", u.m)
|
mes = self.conf.common.wl_min.check_quantity("val", u.m)
|
||||||
mes is not None and error("Configuration check: common -> wl_min: " + mes)
|
mes is not None and logger.error("Configuration check: common -> wl_min: " + mes)
|
||||||
if not hasattr(self.conf.common, "wl_max"):
|
if not hasattr(self.conf.common, "wl_max"):
|
||||||
error("Configuration check: common: Missing required container 'wl_max'.")
|
logger.error("Configuration check: common: Missing required container 'wl_max'.")
|
||||||
mes = self.conf.common.wl_max.check_quantity("val", u.m)
|
mes = self.conf.common.wl_max.check_quantity("val", u.m)
|
||||||
mes is not None and error("Configuration check: common -> wl_max: " + mes)
|
mes is not None and logger.error("Configuration check: common -> wl_max: " + mes)
|
||||||
if hasattr(self.conf.common, "wl_delta"):
|
if hasattr(self.conf.common, "wl_delta"):
|
||||||
mes = self.conf.common.wl_delta.check_quantity("val", u.m)
|
mes = self.conf.common.wl_delta.check_quantity("val", u.m)
|
||||||
mes is not None and error("Configuration check: common -> wl_delta: " + mes)
|
mes is not None and logger.error("Configuration check: common -> wl_delta: " + mes)
|
||||||
elif hasattr(self.conf.common, "res"):
|
elif hasattr(self.conf.common, "res"):
|
||||||
mes = self.conf.common.res.check_quantity("val", u.dimensionless_unscaled)
|
mes = self.conf.common.res.check_quantity("val", u.dimensionless_unscaled)
|
||||||
mes is not None and error("Configuration check: common -> res: " + mes)
|
mes is not None and logger.error("Configuration check: common -> res: " + mes)
|
||||||
else:
|
else:
|
||||||
error("Configuration check: common: Expected one of the containers 'wl_delta' or 'res' but got none.")
|
logger.error(
|
||||||
|
"Configuration check: common: Expected one of the containers 'wl_delta' or 'res' but got none.")
|
||||||
if not hasattr(self.conf.common, "d_aperture"):
|
if not hasattr(self.conf.common, "d_aperture"):
|
||||||
error("Configuration check: common: Missing required container 'd_aperture'.")
|
logger.error("Configuration check: common: Missing required container 'd_aperture'.")
|
||||||
mes = self.conf.common.d_aperture.check_quantity("val", u.m)
|
mes = self.conf.common.d_aperture.check_quantity("val", u.m)
|
||||||
mes is not None and error("Configuration check: common -> d_aperture: " + mes)
|
mes is not None and logger.error("Configuration check: common -> d_aperture: " + mes)
|
||||||
if hasattr(self.conf.common, "psf"):
|
if hasattr(self.conf.common, "psf"):
|
||||||
if hasattr(self.conf.common.psf, "val"):
|
if hasattr(self.conf.common.psf, "val"):
|
||||||
if self.conf.common.psf().lower() != "airy":
|
if self.conf.common.psf().lower() != "airy":
|
||||||
mes = self.conf.common.psf.check_file("val")
|
mes = self.conf.common.psf.check_file("val")
|
||||||
mes is not None and error("Configuration check: common -> psf: " + mes)
|
mes is not None and logger.error("Configuration check: common -> psf: " + mes)
|
||||||
else:
|
else:
|
||||||
setattr(self.conf.common.psf, "val", "Airy")
|
setattr(self.conf.common.psf, "val", "Airy")
|
||||||
if hasattr(self.conf.common.psf, "osf"):
|
if hasattr(self.conf.common.psf, "osf"):
|
||||||
mes = self.conf.common.psf.check_float("osf")
|
mes = self.conf.common.psf.check_float("osf")
|
||||||
mes is not None and error("Configuration check: common -> psf: " + mes)
|
mes is not None and logger.error("Configuration check: common -> psf: " + mes)
|
||||||
else:
|
else:
|
||||||
setattr(self.conf.common.psf, "osf", 10 * u.dimensionless_unscaled)
|
setattr(self.conf.common.psf, "osf", 10 * u.dimensionless_unscaled)
|
||||||
else:
|
else:
|
||||||
setattr(self.conf.common, "psf", Entry(val="Airy", osf=10 * u.dimensionless_unscaled))
|
setattr(self.conf.common, "psf", Entry(val="Airy", osf=10 * u.dimensionless_unscaled))
|
||||||
if hasattr(self.conf.common, "jitter_sigma"):
|
if hasattr(self.conf.common, "jitter_sigma"):
|
||||||
mes = self.conf.common.jitter_sigma.check_quantity("val", u.arcsec)
|
mes = self.conf.common.jitter_sigma.check_quantity("val", u.arcsec)
|
||||||
mes is not None and error("Configuration check: common -> jitter_sigma: " + mes)
|
mes is not None and logger.error("Configuration check: common -> jitter_sigma: " + mes)
|
||||||
if hasattr(self.conf.common, "output_path"):
|
if hasattr(self.conf.common, "output_path"):
|
||||||
if hasattr(self.conf.common.output, "val"):
|
if hasattr(self.conf.common.output, "val"):
|
||||||
mes = self.conf.common.output.check_path("path")
|
mes = self.conf.common.output.check_path("path")
|
||||||
mes is not None and error("Configuration check: common -> output: " + mes)
|
mes is not None and logger.error("Configuration check: common -> output: " + mes)
|
||||||
else:
|
else:
|
||||||
setattr(self.conf.common.output, "val", ".")
|
setattr(self.conf.common.output, "val", ".")
|
||||||
if hasattr(self.conf.common.output, "format"):
|
if hasattr(self.conf.common.output, "format"):
|
||||||
mes = self.conf.common.output.check_selection("format", ["csv", "CSV", "fits", "FITS"])
|
mes = self.conf.common.output.check_selection("format", ["csv", "CSV", "fits", "FITS"])
|
||||||
mes is not None and error("Configuration check: common -> output: " + mes)
|
mes is not None and logger.error("Configuration check: common -> output: " + mes)
|
||||||
else:
|
else:
|
||||||
setattr(self.conf.common.output, "format", "CSV")
|
setattr(self.conf.common.output, "format", "CSV")
|
||||||
else:
|
else:
|
||||||
@ -160,67 +161,70 @@ class Configuration(object):
|
|||||||
mes = self.conf.common.exposure_time.check_quantity("val", u.s)
|
mes = self.conf.common.exposure_time.check_quantity("val", u.s)
|
||||||
if mes is not None:
|
if mes is not None:
|
||||||
mes = self.conf.common.exposure_time.check_file("val")
|
mes = self.conf.common.exposure_time.check_file("val")
|
||||||
mes is not None and error("Configuration check: common -> exposure_time: " + mes)
|
mes is not None and logger.error("Configuration check: common -> exposure_time: " + mes)
|
||||||
self.conf.common.exposure_time.val = readCSV(self.conf.common.exposure_time.val, [u.s],
|
self.conf.common.exposure_time.val = readCSV(self.conf.common.exposure_time.val, [u.s],
|
||||||
format_="csv").columns[0].quantity
|
format_="csv").columns[0].quantity
|
||||||
if hasattr(self.conf.common, "snr"):
|
if hasattr(self.conf.common, "snr"):
|
||||||
mes = self.conf.common.snr.check_quantity("val", u.dimensionless_unscaled)
|
mes = self.conf.common.snr.check_quantity("val", u.dimensionless_unscaled)
|
||||||
if mes is not None:
|
if mes is not None:
|
||||||
mes = self.conf.common.snr.check_file("val")
|
mes = self.conf.common.snr.check_file("val")
|
||||||
mes is not None and error("Configuration check: common -> snr: " + mes)
|
mes is not None and logger.error("Configuration check: common -> snr: " + mes)
|
||||||
self.conf.common.snr.val = readCSV(self.conf.common.snr.val, [u.dimensionless_unscaled],
|
self.conf.common.snr.val = readCSV(self.conf.common.snr.val, [u.dimensionless_unscaled],
|
||||||
format_="csv").columns[0].quantity
|
format_="csv").columns[0].quantity
|
||||||
if hasattr(self.conf.common, "exposure_time") and len(self.conf.common.snr.val) != len(
|
if hasattr(self.conf.common, "exposure_time") and len(self.conf.common.snr.val) != len(
|
||||||
self.conf.common.exposure_time.val):
|
self.conf.common.exposure_time.val):
|
||||||
error(
|
logger.error(
|
||||||
"Configuration check: common -> snr: Length of exposure time (%d) not matching the length of "
|
"Configuration check: common -> snr: Length of exposure time (%d) not matching the length of "
|
||||||
"the SNR (%d)" % (len(self.conf.common.exposure_time.val), len(self.conf.common.snr.val)))
|
"the SNR (%d)" % (len(self.conf.common.exposure_time.val), len(self.conf.common.snr.val)))
|
||||||
if not (hasattr(self.conf.common, "exposure_time") or hasattr(self.conf.common, "snr")):
|
if not (hasattr(self.conf.common, "exposure_time") or hasattr(self.conf.common, "snr")):
|
||||||
error("Configuration check: common: Expected at least one of the containers 'exposure_time' or 'snr' but" +
|
logger.error(
|
||||||
"got none.")
|
"Configuration check: common: Expected at least one of the containers 'exposure_time' or 'snr' but" +
|
||||||
|
"got none.")
|
||||||
|
|
||||||
# Check astroscene
|
# Check astroscene
|
||||||
if not hasattr(self.conf, "astroscene"):
|
if not hasattr(self.conf, "astroscene"):
|
||||||
error("Configuration check: Missing required container 'astroscene'.")
|
logger.error("Configuration check: Missing required container 'astroscene'.")
|
||||||
if not hasattr(self.conf.astroscene, "target"):
|
if not hasattr(self.conf.astroscene, "target"):
|
||||||
error("Configuration check: astroscene: Missing required container 'target'.")
|
logger.error("Configuration check: astroscene: Missing required container 'target'.")
|
||||||
if not hasattr(self.conf.astroscene.target, "type"):
|
if not hasattr(self.conf.astroscene.target, "type"):
|
||||||
error("Configuration check: astroscene -> target: Missing required parameter 'type'.")
|
logger.error("Configuration check: astroscene -> target: Missing required parameter 'type'.")
|
||||||
if self.conf.astroscene.target.type not in dir(tg):
|
if self.conf.astroscene.target.type not in dir(tg):
|
||||||
# noinspection PyTypeChecker
|
# noinspection PyTypeChecker
|
||||||
error("Configuration check: astroscene -> target: Target type '" + self.conf.astroscene.target.type +
|
logger.error("Configuration check: astroscene -> target: Target type '" + self.conf.astroscene.target.type +
|
||||||
"' does not exist. Did you mean '" + difflib.get_close_matches(self.conf.astroscene.target.type,
|
"' does not exist. Did you mean '" +
|
||||||
dir(tg), 1)[0] + "'?")
|
difflib.get_close_matches(self.conf.astroscene.target.type,
|
||||||
|
dir(tg), 1)[0] + "'?")
|
||||||
mes = getattr(tg, self.conf.astroscene.target.type).check_config(self.conf.astroscene.target)
|
mes = getattr(tg, self.conf.astroscene.target.type).check_config(self.conf.astroscene.target)
|
||||||
mes is not None and error("Configuration check: astroscene -> target: " + mes)
|
mes is not None and logger.error("Configuration check: astroscene -> target: " + mes)
|
||||||
if hasattr(self.conf.common, "exposure_time") and hasattr(self.conf.common, "snr"):
|
if hasattr(self.conf.common, "exposure_time") and hasattr(self.conf.common, "snr"):
|
||||||
if self.conf.astroscene.target.type.lower() != "blackbodytarget":
|
if self.conf.astroscene.target.type.lower() != "blackbodytarget":
|
||||||
error("Configuration check: astroscene -> target: Sensitivity calculation only possible for " +
|
logger.error("Configuration check: astroscene -> target: Sensitivity calculation only possible for " +
|
||||||
"a target of the type 'BlackBodyTarget'.")
|
"a target of the type 'BlackBodyTarget'.")
|
||||||
mes = self.__check_optical_components(self.conf.astroscene)
|
mes = self.__check_optical_components(self.conf.astroscene)
|
||||||
mes is not None and error("Configuration check: astroscene -> " + mes)
|
mes is not None and logger.error("Configuration check: astroscene -> " + mes)
|
||||||
|
|
||||||
# Check common_optics
|
# Check common_optics
|
||||||
if hasattr(self.conf, "common_optics") and isinstance(self.conf.common_optics, Entry):
|
if hasattr(self.conf, "common_optics") and isinstance(self.conf.common_optics, Entry):
|
||||||
mes = self.__check_optical_components(self.conf.common_optics)
|
mes = self.__check_optical_components(self.conf.common_optics)
|
||||||
mes is not None and error("Configuration check: common_optics -> " + mes)
|
mes is not None and logger.error("Configuration check: common_optics -> " + mes)
|
||||||
|
|
||||||
# Check instrument
|
# Check instrument
|
||||||
if not hasattr(self.conf, "instrument"):
|
if not hasattr(self.conf, "instrument"):
|
||||||
error("Configuration check: Missing required container 'instrument'.")
|
logger.error("Configuration check: Missing required container 'instrument'.")
|
||||||
mes = self.__check_optical_components(self.conf.instrument)
|
mes = self.__check_optical_components(self.conf.instrument)
|
||||||
mes is not None and error("Configuration check: instrument -> " + mes)
|
mes is not None and logger.error("Configuration check: instrument -> " + mes)
|
||||||
if not hasattr(self.conf.instrument, "sensor"):
|
if not hasattr(self.conf.instrument, "sensor"):
|
||||||
error("Configuration check: instrument: Missing required container 'sensor'.")
|
logger.error("Configuration check: instrument: Missing required container 'sensor'.")
|
||||||
if not hasattr(self.conf.instrument.sensor, "type"):
|
if not hasattr(self.conf.instrument.sensor, "type"):
|
||||||
error("Configuration check: instrument -> sensor: Missing required parameter 'type'.")
|
logger.error("Configuration check: instrument -> sensor: Missing required parameter 'type'.")
|
||||||
if self.conf.instrument.sensor.type not in dir(sensor):
|
if self.conf.instrument.sensor.type not in dir(sensor):
|
||||||
# noinspection PyTypeChecker
|
# noinspection PyTypeChecker
|
||||||
error("Configuration check: instrument -> sensor: Sensor type '" + self.conf.instrument.sensor.type +
|
logger.error("Configuration check: instrument -> sensor: Sensor type '" + self.conf.instrument.sensor.type +
|
||||||
"' does not exist. Did you mean '" + difflib.get_close_matches(self.conf.instrument.sensor.type,
|
"' does not exist. Did you mean '" +
|
||||||
dir(sensor), 1)[0] + "'?")
|
difflib.get_close_matches(self.conf.instrument.sensor.type,
|
||||||
|
dir(sensor), 1)[0] + "'?")
|
||||||
mes = getattr(sensor, self.conf.instrument.sensor.type).check_config(self.conf.instrument.sensor, self.conf)
|
mes = getattr(sensor, self.conf.instrument.sensor.type).check_config(self.conf.instrument.sensor, self.conf)
|
||||||
mes is not None and error("Configuration check: instrument -> sensor -> " + mes)
|
mes is not None and logger.error("Configuration check: instrument -> sensor -> " + mes)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def __check_optical_components(conf: Union[Entry, list]) -> Union[None, str]:
|
def __check_optical_components(conf: Union[Entry, list]) -> Union[None, str]:
|
||||||
@ -238,17 +242,18 @@ class Configuration(object):
|
|||||||
The error message of the check. This will be None if the check was successful.
|
The error message of the check. This will be None if the check was successful.
|
||||||
"""
|
"""
|
||||||
if hasattr(conf, "optical_component"):
|
if hasattr(conf, "optical_component"):
|
||||||
for component in (conf.optical_component if type(conf.optical_component) == list else
|
for component in (
|
||||||
[conf.optical_component]):
|
conf.optical_component if type(conf.optical_component) == list else [conf.optical_component]):
|
||||||
if not hasattr(component, "type"):
|
if hasattr(component, "type"):
|
||||||
|
if component.type not in dir(oc):
|
||||||
|
# noinspection PyTypeChecker
|
||||||
|
return "optical_component: optical component type '" + component.type + \
|
||||||
|
"' does not exist. Did you mean '" + \
|
||||||
|
difflib.get_close_matches(component.type, dir(tg), 1)[0] + "'?"
|
||||||
|
mes = getattr(oc, component.type).check_config(component)
|
||||||
|
if mes is not None:
|
||||||
|
print(component.type)
|
||||||
|
print(mes)
|
||||||
|
return "optical_component -> " + component.type + ": " + mes
|
||||||
|
else:
|
||||||
return "optical_component: Missing required parameter 'type'."
|
return "optical_component: Missing required parameter 'type'."
|
||||||
if component.type not in dir(oc):
|
|
||||||
# noinspection PyTypeChecker
|
|
||||||
return "optical_component: optical component type '" + component.type + \
|
|
||||||
"' does not exist. Did you mean '" + \
|
|
||||||
difflib.get_close_matches(component.type, dir(tg), 1)[0] + "'?"
|
|
||||||
mes = getattr(oc, component.type).check_config(component)
|
|
||||||
if mes is not None:
|
|
||||||
print(component.type)
|
|
||||||
print(mes)
|
|
||||||
return "optical_component -> " + component.type + ": " + mes
|
|
||||||
|
@ -2,7 +2,7 @@ from typing import Union
|
|||||||
import re
|
import re
|
||||||
import xml.etree.ElementTree as eT
|
import xml.etree.ElementTree as eT
|
||||||
import astropy.units as u
|
import astropy.units as u
|
||||||
from ..lib.helpers import error
|
from ..lib.logger import logger
|
||||||
import difflib
|
import difflib
|
||||||
import os
|
import os
|
||||||
|
|
||||||
@ -45,8 +45,8 @@ class Entry(object):
|
|||||||
val = val[0]
|
val = val[0]
|
||||||
setattr(self, var, val)
|
setattr(self, var, val)
|
||||||
except (ValueError, LookupError):
|
except (ValueError, LookupError):
|
||||||
error("unable to convert units in entry '" + xml.tag + "': " + getattr(self, var) + " " +
|
logger.error("unable to convert units in entry '" + xml.tag + "': " + getattr(self, var) + " " +
|
||||||
getattr(self, unit), exit_=False)
|
getattr(self, unit), exit_=False)
|
||||||
# Convert boolean values
|
# Convert boolean values
|
||||||
if hasattr(self, "val") and type(self.val) == str and self.val.lower() in ["false", "true"]:
|
if hasattr(self, "val") and type(self.val) == str and self.val.lower() in ["false", "true"]:
|
||||||
self.val = (self.val.lower() == "true")
|
self.val = (self.val.lower() == "true")
|
||||||
@ -61,6 +61,8 @@ class Entry(object):
|
|||||||
The name of the parameter to be checked.
|
The name of the parameter to be checked.
|
||||||
unit : Quantity
|
unit : Quantity
|
||||||
The default quantity to be used for conversion and equality checking.
|
The default quantity to be used for conversion and equality checking.
|
||||||
|
use_default : bool
|
||||||
|
Use the given unit as default unit and try to convert strings to Quantities with this unit.
|
||||||
|
|
||||||
Returns
|
Returns
|
||||||
-------
|
-------
|
||||||
@ -109,7 +111,7 @@ class Entry(object):
|
|||||||
match = difflib.get_close_matches(attr, choices, 1)
|
match = difflib.get_close_matches(attr, choices, 1)
|
||||||
if len(match) > 0:
|
if len(match) > 0:
|
||||||
# noinspection PyTypeChecker
|
# noinspection PyTypeChecker
|
||||||
return "Value '" + attr + "' not allowed for parameter '" + name + "'. Did you mean '" +\
|
return "Value '" + attr + "' not allowed for parameter '" + name + "'. Did you mean '" + \
|
||||||
match[0] + "'?"
|
match[0] + "'?"
|
||||||
else:
|
else:
|
||||||
return "Value '" + attr + "' not allowed for parameter '" + name + "'."
|
return "Value '" + attr + "' not allowed for parameter '" + name + "'."
|
||||||
|
@ -3,7 +3,7 @@ from .Entry import Entry
|
|||||||
from .IRadiant import IRadiant
|
from .IRadiant import IRadiant
|
||||||
from ..classes import optical_component as oc
|
from ..classes import optical_component as oc
|
||||||
from ..classes import target as tg
|
from ..classes import target as tg
|
||||||
from ..lib.helpers import error
|
from ..lib.logger import logger
|
||||||
import copy
|
import copy
|
||||||
import re
|
import re
|
||||||
|
|
||||||
@ -58,7 +58,7 @@ class RadiantFactory:
|
|||||||
# File Target
|
# File Target
|
||||||
return getattr(tg, options.type)(**attribs)
|
return getattr(tg, options.type)(**attribs)
|
||||||
else:
|
else:
|
||||||
error("Unknown target type: '" + options.type + "'")
|
logger.error("Unknown target type: '" + options.type + "'")
|
||||||
else:
|
else:
|
||||||
# New component is of type Optical Component
|
# New component is of type Optical Component
|
||||||
attribs["parent"] = parent
|
attribs["parent"] = parent
|
||||||
@ -75,11 +75,11 @@ class RadiantFactory:
|
|||||||
elif hasattr(options, "start") and hasattr(options, "end"):
|
elif hasattr(options, "start") and hasattr(options, "end"):
|
||||||
return oc.Filter.fromRange(**attribs)
|
return oc.Filter.fromRange(**attribs)
|
||||||
else:
|
else:
|
||||||
error("Wrong parameters for filter.")
|
logger.error("Wrong parameters for filter.")
|
||||||
else:
|
else:
|
||||||
error("Unknown optical component type: '" + options.type + "'")
|
logger.error("Unknown optical component type: '" + options.type + "'")
|
||||||
else:
|
else:
|
||||||
error("Optical component needs to have a type specified.")
|
logger.error("Optical component needs to have a type specified.")
|
||||||
|
|
||||||
def fromConfigBatch(self, conf: Entry) -> IRadiant:
|
def fromConfigBatch(self, conf: Entry) -> IRadiant:
|
||||||
"""
|
"""
|
||||||
@ -103,9 +103,11 @@ class RadiantFactory:
|
|||||||
if hasattr(conf, "common_optics") and hasattr(conf.common_optics, "optical_component"):
|
if hasattr(conf, "common_optics") and hasattr(conf.common_optics, "optical_component"):
|
||||||
for entry in conf.common_optics.optical_component if type(conf.common_optics.optical_component) == \
|
for entry in conf.common_optics.optical_component if type(conf.common_optics.optical_component) == \
|
||||||
list else [conf.common_optics.optical_component]:
|
list else [conf.common_optics.optical_component]:
|
||||||
parent = self.create(entry, parent)
|
if isinstance(entry, Entry):
|
||||||
|
parent = self.create(entry, parent)
|
||||||
if hasattr(conf, "instrument") and hasattr(conf.instrument, "optical_component"):
|
if hasattr(conf, "instrument") and hasattr(conf.instrument, "optical_component"):
|
||||||
for entry in conf.instrument.optical_component if type(conf.instrument.optical_component) == list else\
|
for entry in conf.instrument.optical_component if type(conf.instrument.optical_component) == list else\
|
||||||
[conf.instrument.optical_component]:
|
[conf.instrument.optical_component]:
|
||||||
parent = self.create(entry, parent)
|
if isinstance(entry, Entry):
|
||||||
|
parent = self.create(entry, parent)
|
||||||
return parent
|
return parent
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
from ..lib.helpers import error, isLambda, readCSV
|
from ..lib.helpers import isLambda, readCSV
|
||||||
|
from ..lib.logger import logger
|
||||||
from scipy.interpolate import interp1d
|
from scipy.interpolate import interp1d
|
||||||
import astropy.units as u
|
import astropy.units as u
|
||||||
import math
|
import math
|
||||||
from typing import Union, Callable
|
from typing import Union, Callable
|
||||||
import logging
|
|
||||||
from astropy.io import ascii
|
|
||||||
import re
|
|
||||||
import os
|
import os
|
||||||
from scipy.integrate import trapz
|
from scipy.integrate import trapz
|
||||||
|
|
||||||
@ -47,7 +45,7 @@ class SpectralQty:
|
|||||||
else:
|
else:
|
||||||
self.qty = qty * u.dimensionless_unscaled
|
self.qty = qty * u.dimensionless_unscaled
|
||||||
else:
|
else:
|
||||||
error("Lengths not matching")
|
logger.error("Lengths not matching")
|
||||||
self._fill_value = fill_value
|
self._fill_value = fill_value
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -166,7 +164,7 @@ class SpectralQty:
|
|||||||
# Wavelengths are still not matching as extrapolation is disabled, rebin this spectral quantity
|
# Wavelengths are still not matching as extrapolation is disabled, rebin this spectral quantity
|
||||||
return SpectralQty(other_rebinned.wl, self.rebin(other_rebinned.wl).qty + other_rebinned.qty)
|
return SpectralQty(other_rebinned.wl, self.rebin(other_rebinned.wl).qty + other_rebinned.qty)
|
||||||
else:
|
else:
|
||||||
error("Units are not matching for addition.")
|
logger.error("Units are not matching for addition.")
|
||||||
|
|
||||||
__radd__ = __add__
|
__radd__ = __add__
|
||||||
|
|
||||||
@ -214,7 +212,7 @@ class SpectralQty:
|
|||||||
# Wavelengths are still not matching as extrapolation is disabled, rebin this spectral quantity
|
# Wavelengths are still not matching as extrapolation is disabled, rebin this spectral quantity
|
||||||
return SpectralQty(other_rebinned.wl, self.rebin(other_rebinned.wl).qty - other_rebinned.qty)
|
return SpectralQty(other_rebinned.wl, self.rebin(other_rebinned.wl).qty - other_rebinned.qty)
|
||||||
else:
|
else:
|
||||||
error("Units are not matching for substraction.")
|
logger.error("Units are not matching for substraction.")
|
||||||
|
|
||||||
def __mul__(self, other: Union[int, float, u.Quantity, "SpectralQty", Callable[[u.Quantity], u.Quantity]]) ->\
|
def __mul__(self, other: Union[int, float, u.Quantity, "SpectralQty", Callable[[u.Quantity], u.Quantity]]) ->\
|
||||||
"SpectralQty":
|
"SpectralQty":
|
||||||
@ -254,7 +252,7 @@ class SpectralQty:
|
|||||||
# Wavelengths are still not matching as extrapolation is disabled, rebin this spectral quantity
|
# Wavelengths are still not matching as extrapolation is disabled, rebin this spectral quantity
|
||||||
return SpectralQty(other_rebinned.wl, self.rebin(other_rebinned.wl).qty * other_rebinned.qty)
|
return SpectralQty(other_rebinned.wl, self.rebin(other_rebinned.wl).qty * other_rebinned.qty)
|
||||||
else:
|
else:
|
||||||
error("Units are not matching for multiplication.")
|
logger.error("Units are not matching for multiplication.")
|
||||||
|
|
||||||
__rmul__ = __mul__
|
__rmul__ = __mul__
|
||||||
|
|
||||||
@ -296,7 +294,7 @@ class SpectralQty:
|
|||||||
# Wavelengths are still not matching as extrapolation is disabled, rebin this spectral quantity
|
# Wavelengths are still not matching as extrapolation is disabled, rebin this spectral quantity
|
||||||
return SpectralQty(other_rebinned.wl, self.rebin(other_rebinned.wl).qty / other_rebinned.qty)
|
return SpectralQty(other_rebinned.wl, self.rebin(other_rebinned.wl).qty / other_rebinned.qty)
|
||||||
else:
|
else:
|
||||||
error("Units are not matching for division.")
|
logger.error("Units are not matching for division.")
|
||||||
|
|
||||||
def rebin(self, wl: u.Quantity) -> "SpectralQty":
|
def rebin(self, wl: u.Quantity) -> "SpectralQty":
|
||||||
"""
|
"""
|
||||||
@ -315,11 +313,11 @@ class SpectralQty:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
if not wl.unit.is_equivalent(self.wl.unit):
|
if not wl.unit.is_equivalent(self.wl.unit):
|
||||||
error("Mismatching units for rebinning: " + wl.unit + ", " + self.wl.unit)
|
logger.error("Mismatching units for rebinning: " + wl.unit + ", " + self.wl.unit)
|
||||||
if min(wl) < min(self.wl) or max(wl) > max(self.wl):
|
if min(wl) < min(self.wl) or max(wl) > max(self.wl):
|
||||||
if isinstance(self._fill_value, bool):
|
if isinstance(self._fill_value, bool):
|
||||||
if not self._fill_value:
|
if not self._fill_value:
|
||||||
logging.warning("Extrapolation disabled, bandwidth will be reduced.")
|
logger.warning("Extrapolation disabled, bandwidth will be reduced.")
|
||||||
# Remove new wavelengths where extrapolation would have been necessary
|
# Remove new wavelengths where extrapolation would have been necessary
|
||||||
wl = [x.value for x in wl if min(self.wl) <= x <= max(self.wl)] * wl.unit
|
wl = [x.value for x in wl if min(self.wl) <= x <= max(self.wl)] * wl.unit
|
||||||
f = interp1d(self.wl, self.qty.value, fill_value="extrapolate")
|
f = interp1d(self.wl, self.qty.value, fill_value="extrapolate")
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
from ..IRadiant import IRadiant
|
from ..IRadiant import IRadiant
|
||||||
from ..SpectralQty import SpectralQty
|
from ..SpectralQty import SpectralQty
|
||||||
from ...lib.helpers import error
|
from ...lib.logger import logger
|
||||||
from abc import abstractmethod
|
from abc import abstractmethod
|
||||||
import astropy.units as u
|
import astropy.units as u
|
||||||
from astropy.modeling.models import BlackBody
|
from astropy.modeling.models import BlackBody
|
||||||
from typing import Union, Callable, Tuple
|
from typing import Union, Callable, Tuple
|
||||||
from logging import info, debug
|
|
||||||
from ..Entry import Entry
|
from ..Entry import Entry
|
||||||
|
|
||||||
|
|
||||||
@ -66,10 +65,10 @@ class AOpticalComponent(IRadiant):
|
|||||||
The obstruction factor as A_ob / A_ap.
|
The obstruction factor as A_ob / A_ap.
|
||||||
"""
|
"""
|
||||||
signal, size, obstruction = self.__parent.calcSignal()
|
signal, size, obstruction = self.__parent.calcSignal()
|
||||||
info("Calculating signal for class '" + self.__class__.__name__ + "'.")
|
logger.info("Calculating signal for class '" + self.__class__.__name__ + "'.")
|
||||||
signal = self._propagate(signal) * (1 - self.__obstruction)
|
signal = self._propagate(signal) * (1 - self.__obstruction)
|
||||||
obstruction = obstruction + self.__obstruction
|
obstruction = obstruction + self.__obstruction
|
||||||
debug(signal)
|
logger.debug(signal)
|
||||||
return signal, size, obstruction
|
return signal, size, obstruction
|
||||||
|
|
||||||
def calcBackground(self) -> SpectralQty:
|
def calcBackground(self) -> SpectralQty:
|
||||||
@ -82,7 +81,7 @@ class AOpticalComponent(IRadiant):
|
|||||||
The spectral radiance of the background
|
The spectral radiance of the background
|
||||||
"""
|
"""
|
||||||
parent = self.__parent.calcBackground()
|
parent = self.__parent.calcBackground()
|
||||||
info("Calculating background for class '" + self.__class__.__name__ + "'.")
|
logger.info("Calculating background for class '" + self.__class__.__name__ + "'.")
|
||||||
parent = self._propagate(parent)
|
parent = self._propagate(parent)
|
||||||
if self.__obstructor_temp > 0 * u.K:
|
if self.__obstructor_temp > 0 * u.K:
|
||||||
bb = BlackBody(temperature=self.__obstructor_temp, scale=1. * u.W / (u.m ** 2 * u.nm * u.sr))
|
bb = BlackBody(temperature=self.__obstructor_temp, scale=1. * u.W / (u.m ** 2 * u.nm * u.sr))
|
||||||
@ -91,7 +90,7 @@ class AOpticalComponent(IRadiant):
|
|||||||
else:
|
else:
|
||||||
background = parent * (1. - self.__obstruction)
|
background = parent * (1. - self.__obstruction)
|
||||||
background = background + self._ownNoise()
|
background = background + self._ownNoise()
|
||||||
debug(background)
|
logger.debug(background)
|
||||||
return background
|
return background
|
||||||
|
|
||||||
def _propagate(self, rad: SpectralQty) -> SpectralQty:
|
def _propagate(self, rad: SpectralQty) -> SpectralQty:
|
||||||
@ -111,7 +110,7 @@ class AOpticalComponent(IRadiant):
|
|||||||
try:
|
try:
|
||||||
return rad * self.__transreflectivity
|
return rad * self.__transreflectivity
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
error("Transreflectivity not given. Method propagate() needs to be implemented.")
|
logger.error("Transreflectivity not given. Method propagate() needs to be implemented.")
|
||||||
|
|
||||||
def _ownNoise(self) -> Union[SpectralQty, Callable[[u.Quantity], u.Quantity], int, float]:
|
def _ownNoise(self) -> Union[SpectralQty, Callable[[u.Quantity], u.Quantity], int, float]:
|
||||||
"""
|
"""
|
||||||
@ -125,7 +124,7 @@ class AOpticalComponent(IRadiant):
|
|||||||
try:
|
try:
|
||||||
return self.__noise
|
return self.__noise
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
error("noise not given. Method ownNoise() needs to be implemented.")
|
logger.error("noise not given. Method ownNoise() needs to be implemented.")
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
from .AHotOpticalComponent import AHotOpticalComponent
|
from .AHotOpticalComponent import AHotOpticalComponent
|
||||||
from ..SpectralQty import SpectralQty
|
from ..SpectralQty import SpectralQty
|
||||||
from ..IRadiant import IRadiant
|
from ..IRadiant import IRadiant
|
||||||
from ...lib.helpers import error
|
from ...lib.logger import logger
|
||||||
from ..Entry import Entry
|
from ..Entry import Entry
|
||||||
from astropy import units as u
|
from astropy import units as u
|
||||||
from typing import Union, Callable
|
from typing import Union, Callable
|
||||||
@ -86,7 +86,7 @@ class Filter(AHotOpticalComponent):
|
|||||||
The instantiated filter object.
|
The instantiated filter object.
|
||||||
"""
|
"""
|
||||||
if band not in cls._band.keys():
|
if band not in cls._band.keys():
|
||||||
error("Band has to be one of '[" + ", ".join(list(cls._band.keys())) + "]'")
|
logger.error("Band has to be one of '[" + ", ".join(list(cls._band.keys())) + "]'")
|
||||||
return cls.fromRange(parent, cls._band[band]["cwl"] - cls._band[band]["bw"] / 2,
|
return cls.fromRange(parent, cls._band[band]["cwl"] - cls._band[band]["bw"] / 2,
|
||||||
cls._band[band]["cwl"] + cls._band[band]["bw"] / 2, emissivity, temp, obstruction,
|
cls._band[band]["cwl"] + cls._band[band]["bw"] / 2, emissivity, temp, obstruction,
|
||||||
obstructor_temp, obstructor_emissivity)
|
obstructor_temp, obstructor_emissivity)
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
from .IPSF import IPSF
|
from .IPSF import IPSF
|
||||||
from ...lib.helpers import error, rasterizeCircle
|
from ...lib.helpers import rasterizeCircle
|
||||||
from ..sensor.PixelMask import PixelMask
|
from ..sensor.PixelMask import PixelMask
|
||||||
|
from ...lib.logger import logger
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import astropy.units as u
|
import astropy.units as u
|
||||||
import re
|
import re
|
||||||
from logging import warning
|
|
||||||
from typing import Union
|
from typing import Union
|
||||||
from scipy.optimize import bisect
|
from scipy.optimize import bisect
|
||||||
from scipy.signal import fftconvolve
|
from scipy.signal import fftconvolve
|
||||||
@ -52,7 +52,7 @@ class Zemax(IPSF):
|
|||||||
# Parse shape of the grid and check the read PSF-array
|
# Parse shape of the grid and check the read PSF-array
|
||||||
shape = [int(x) for x in re.findall("[0-9]+", list(filter(re.compile("Image grid size: ").match, head))[0])]
|
shape = [int(x) for x in re.findall("[0-9]+", list(filter(re.compile("Image grid size: ").match, head))[0])]
|
||||||
if shape != list(self.__psf.shape):
|
if shape != list(self.__psf.shape):
|
||||||
warning("Not all PSF entries read.")
|
logger.warning("Not all PSF entries read.")
|
||||||
# Parse and calculate the grid width
|
# Parse and calculate the grid width
|
||||||
grid_delta = [float(x.replace(",", ".")) for x in
|
grid_delta = [float(x.replace(",", ".")) for x in
|
||||||
re.findall("[0-9]+,*[0-9]*", list(filter(re.compile("Data area is ").match, head))[0])]
|
re.findall("[0-9]+,*[0-9]*", list(filter(re.compile("Data area is ").match, head))[0])]
|
||||||
@ -95,7 +95,7 @@ class Zemax(IPSF):
|
|||||||
try:
|
try:
|
||||||
contained_energy = float(contained_energy) / 100.0 * u.dimensionless_unscaled
|
contained_energy = float(contained_energy) / 100.0 * u.dimensionless_unscaled
|
||||||
except ValueError:
|
except ValueError:
|
||||||
error("Could not convert encircled energy to float.")
|
logger.error("Could not convert encircled energy to float.")
|
||||||
elif type(contained_energy) in [int, float]:
|
elif type(contained_energy) in [int, float]:
|
||||||
contained_energy = contained_energy / 100 * u.dimensionless_unscaled
|
contained_energy = contained_energy / 100 * u.dimensionless_unscaled
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import astropy.units as u
|
import astropy.units as u
|
||||||
from logging import warning
|
from ...lib.logger import logger
|
||||||
from ...lib.helpers import error, rasterizeCircle
|
from ...lib.helpers import rasterizeCircle
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
@ -99,7 +99,7 @@ class PixelMask(np.ndarray):
|
|||||||
yc = self.psf_center_ind[0] * u.pix
|
yc = self.psf_center_ind[0] * u.pix
|
||||||
if (xc + radius).value > self.pixel_geometry[0].value - 1 or (xc - radius).value < 0 or\
|
if (xc + radius).value > self.pixel_geometry[0].value - 1 or (xc - radius).value < 0 or\
|
||||||
(yc + radius).value > self.pixel_geometry[1].value - 1 or (yc - radius).value < 0:
|
(yc + radius).value > self.pixel_geometry[1].value - 1 or (yc - radius).value < 0:
|
||||||
warning("Some parts of the photometric aperture are outside of the array.")
|
logger.warning("Some parts of the photometric aperture are outside of the array.")
|
||||||
if shape.lower() == "circle":
|
if shape.lower() == "circle":
|
||||||
# Rasterize a circle on the grid
|
# Rasterize a circle on the grid
|
||||||
rasterizeCircle(self, radius.value, xc.value, yc.value)
|
rasterizeCircle(self, radius.value, xc.value, yc.value)
|
||||||
@ -117,4 +117,4 @@ class PixelMask(np.ndarray):
|
|||||||
# Mark the pixels contained in the square with 1
|
# Mark the pixels contained in the square with 1
|
||||||
self[y_up:(y_low + 1), x_left:(x_right + 1)] = 1
|
self[y_up:(y_low + 1), x_left:(x_right + 1)] = 1
|
||||||
else:
|
else:
|
||||||
error("Unknown photometric aperture shape: '" + shape + "'.")
|
logger.error("Unknown photometric aperture shape: '" + shape + "'.")
|
||||||
|
@ -2,7 +2,7 @@ from ..IRadiant import IRadiant
|
|||||||
from ..Entry import Entry
|
from ..Entry import Entry
|
||||||
from .ASensor import ASensor
|
from .ASensor import ASensor
|
||||||
from .Imager import Imager
|
from .Imager import Imager
|
||||||
from ...lib.helpers import error
|
from ...lib.logger import logger
|
||||||
|
|
||||||
|
|
||||||
class SensorFactory:
|
class SensorFactory:
|
||||||
@ -50,4 +50,4 @@ class SensorFactory:
|
|||||||
args["contained_pixels"] = options.photometric_aperture.contained_pixels()
|
args["contained_pixels"] = options.photometric_aperture.contained_pixels()
|
||||||
return Imager(**args)
|
return Imager(**args)
|
||||||
else:
|
else:
|
||||||
error("Wrong sensor type: " + options.type)
|
logger.error("Wrong sensor type: " + options.type)
|
||||||
|
@ -3,7 +3,7 @@ from ..IRadiant import IRadiant
|
|||||||
from ..SpectralQty import SpectralQty
|
from ..SpectralQty import SpectralQty
|
||||||
import astropy.units as u
|
import astropy.units as u
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from logging import info, debug
|
from ...lib.logger import logger
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
from ..Entry import Entry
|
from ..Entry import Entry
|
||||||
|
|
||||||
@ -41,9 +41,9 @@ class ATarget(IRadiant):
|
|||||||
background : SpectralQty
|
background : SpectralQty
|
||||||
The spectral radiance of the target's background
|
The spectral radiance of the target's background
|
||||||
"""
|
"""
|
||||||
info("Calculating Noise for class '" + self.__class__.__name__ + "'.")
|
logger.info("Calculating noise for class '" + self.__class__.__name__ + "'.")
|
||||||
background = SpectralQty(self.__wl_bins, np.repeat(0, len(self.__wl_bins)) << u.W / (u.m**2 * u.nm * u.sr))
|
background = SpectralQty(self.__wl_bins, np.repeat(0, len(self.__wl_bins)) << u.W / (u.m**2 * u.nm * u.sr))
|
||||||
debug(background)
|
logger.debug(background)
|
||||||
return background
|
return background
|
||||||
|
|
||||||
def calcSignal(self) -> Tuple[SpectralQty, str, float]:
|
def calcSignal(self) -> Tuple[SpectralQty, str, float]:
|
||||||
@ -59,8 +59,8 @@ class ATarget(IRadiant):
|
|||||||
obstruction : float
|
obstruction : float
|
||||||
The obstruction factor as A_ob / A_ap.
|
The obstruction factor as A_ob / A_ap.
|
||||||
"""
|
"""
|
||||||
info("Calculating Signal for class '" + self.__class__.__name__ + "'.")
|
logger.info("Calculating signal for class '" + self.__class__.__name__ + "'.")
|
||||||
debug(self.__sfd)
|
logger.debug(self.__sfd)
|
||||||
return self.__sfd, self.__size, 0.0
|
return self.__sfd, self.__size, 0.0
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -2,7 +2,7 @@ from ..target.ATarget import ATarget
|
|||||||
from ..SpectralQty import SpectralQty
|
from ..SpectralQty import SpectralQty
|
||||||
import astropy.units as u
|
import astropy.units as u
|
||||||
from astropy.modeling.models import BlackBody
|
from astropy.modeling.models import BlackBody
|
||||||
from ...lib.helpers import error
|
from ...lib.logger import logger
|
||||||
from ..Entry import Entry
|
from ..Entry import Entry
|
||||||
from typing import Union
|
from typing import Union
|
||||||
|
|
||||||
@ -47,7 +47,7 @@ class BlackBodyTarget(ATarget):
|
|||||||
-------
|
-------
|
||||||
"""
|
"""
|
||||||
if band.upper() not in self._band.keys():
|
if band.upper() not in self._band.keys():
|
||||||
error("Band has to be one of '[" + ", ".join(list(self._band.keys())) + "]'")
|
logger.error("Band has to be one of '[" + ", ".join(list(self._band.keys())) + "]'")
|
||||||
# Create blackbody model with given temperature
|
# Create blackbody model with given temperature
|
||||||
bb = BlackBody(temperature=temp, scale=1 * u.W / (u.m ** 2 * u.nm * u.sr))
|
bb = BlackBody(temperature=temp, scale=1 * u.W / (u.m ** 2 * u.nm * u.sr))
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user