Configuration checks added

This commit is contained in:
Lukas Klass 2020-05-08 15:06:13 +02:00
parent fb2238b0b7
commit 35488b4fb5
12 changed files with 384 additions and 26 deletions

View File

@ -5,6 +5,7 @@ from abc import abstractmethod
import astropy.units as u
from astropy.modeling.models import BlackBody
from typing import Union, Callable
from ..Entry import Entry
class AHotOpticalComponent(AOpticalComponent):
@ -90,3 +91,21 @@ class AHotOpticalComponent(AOpticalComponent):
"""
bb = BlackBody(temperature=temp, scale=em * u.W / (u.m ** 2 * u.nm * u.sr))
return lambda wl: bb(wl)
@staticmethod
@abstractmethod
def check_config(conf: Entry) -> Union[None, str]:
"""
Check the configuration for this class
Parameters
----------
conf : Entry
The configuration entry to be checked.
Returns
-------
mes : Union[None, str]
The error message of the check. This will be None if the check was successful.
"""
pass

View File

@ -6,6 +6,7 @@ import astropy.units as u
from astropy.modeling.models import BlackBody
from typing import Union, Callable, Tuple
from logging import info, debug
from ..Entry import Entry
class AOpticalComponent(IRadiant):
@ -122,3 +123,21 @@ class AOpticalComponent(IRadiant):
return self.__noise
except AttributeError:
error("noise not given. Method ownNoise() needs to be implemented.")
@staticmethod
@abstractmethod
def check_config(conf: Entry) -> Union[None, str]:
"""
Check the configuration for this class
Parameters
----------
conf : Entry
The configuration entry to be checked.
Returns
-------
mes : Union[None, str]
The error message of the check. This will be None if the check was successful.
"""
pass

View File

@ -1,7 +1,9 @@
from .AOpticalComponent import AOpticalComponent
from ..IRadiant import IRadiant
from ..SpectralQty import SpectralQty
from ..Entry import Entry
import astropy.units as u
from typing import Union
class Atmosphere(AOpticalComponent):
@ -37,3 +39,26 @@ class Atmosphere(AOpticalComponent):
qty_unit_default=u.W / (u.m ** 2 * u.nm * u.sr))
# Initialize the super class
super().__init__(parent, transmittance_sqty, emission_sqty)
@staticmethod
def check_config(conf: Entry) -> Union[None, str]:
"""
Check the configuration for this class
Parameters
----------
conf : Entry
The configuration entry to be checked.
Returns
-------
mes : Union[None, str]
The error message of the check. This will be None if the check was successful.
"""
mes = conf.check_file("transmittance")
if mes is not None:
return mes
if hasattr(conf, "emission"):
mes = conf.check_file("emission")
if mes is not None:
return mes

View File

@ -1,6 +1,7 @@
from .AHotOpticalComponent import AHotOpticalComponent
from ..SpectralQty import SpectralQty
from ..IRadiant import IRadiant
from ..Entry import Entry
from astropy import units as u
from typing import Union
@ -10,9 +11,9 @@ class BeamSplitter(AHotOpticalComponent):
A class to model the optical characteristics of a beam splitter.
"""
@u.quantity_input(temp=[u.Kelvin, u.Celsius], obstructor_temp=[u.Kelvin, u.Celsius])
def __init__(self, parent: IRadiant, transmittance: str,
emissivity: Union[int, float, str] = 1, temp: u.Quantity = 0 * u.K,
obstruction: float = 0, obstructor_temp: u.Quantity = 0 * u.K, obstructor_emissivity: float = 1):
def __init__(self, parent: IRadiant, transmittance: str, emissivity: Union[str, float] = 1,
temp: u.Quantity = 0 * u.K, obstruction: float = 0, obstructor_temp: u.Quantity = 0 * u.K,
obstructor_emissivity: float = 1):
"""
Instantiate a new beam splitter model
@ -22,7 +23,7 @@ class BeamSplitter(AHotOpticalComponent):
The parent element of the optical component from which the electromagnetic radiation is received.
transmittance : str
The spectral transmittance coefficients of the filter.
emissivity : Union[int, float, str]
emissivity : Union[str, u.Quantity]
The spectral emissivity coefficient for the optical surface.
temp: Quantity in Kelvin / Celsius
Temperature of the optical component
@ -54,3 +55,44 @@ class BeamSplitter(AHotOpticalComponent):
Manipulated incoming radiation
"""
return rad * self._transmittance
@staticmethod
def check_config(conf: Entry) -> Union[None, str]:
"""
Check the configuration for this class
Parameters
----------
conf : Entry
The configuration entry to be checked.
Returns
-------
mes : Union[None, str]
The error message of the check. This will be None if the check was successful.
"""
mes = conf.check_file("transmittance")
if mes is not None:
return mes
if hasattr(conf, "emissivity"):
mes = conf.check_file("emissivity")
if mes is not None:
mes = conf.check_float("emissivity")
if mes is not None:
return mes
if hasattr(conf, "temp"):
mes = conf.check_quantity("temp", u.K)
if mes is not None:
return mes
if hasattr(conf, "obstruction"):
mes = conf.check_float("obstruction")
if mes is not None:
return mes
if hasattr(conf, "obstructor_temp"):
mes = conf.check_quantity("obstructor_temp", u.K)
if mes is not None:
return mes
if hasattr(conf, "obstructor_emissivity"):
mes = conf.check_float("obstructor_emissivity")
if mes is not None:
return mes

View File

@ -2,6 +2,7 @@ from .AHotOpticalComponent import AHotOpticalComponent
from ..SpectralQty import SpectralQty
from ..IRadiant import IRadiant
from ...lib.helpers import error
from ..Entry import Entry
from astropy import units as u
from typing import Union, Callable
import numpy as np
@ -22,8 +23,8 @@ class Filter(AHotOpticalComponent):
@u.quantity_input(temp=[u.Kelvin, u.Celsius], obstructor_temp=[u.Kelvin, u.Celsius])
def __init__(self, parent: IRadiant, transmittance: Union[SpectralQty, Callable[[u.Quantity], u.Quantity]],
emissivity: Union[int, float, str] = 1, temp: u.Quantity = 0 * u.K,
obstruction: float = 0, obstructor_temp: u.Quantity = 0 * u.K, obstructor_emissivity: float = 1):
emissivity: Union[str, float] = 1, temp: u.Quantity = 0 * u.K, obstruction: float = 0,
obstructor_temp: u.Quantity = 0 * u.K, obstructor_emissivity: float = 1):
"""
Instantiate a new filter model
@ -33,7 +34,7 @@ class Filter(AHotOpticalComponent):
The parent element of the optical component from which the electromagnetic radiation is received.
transmittance : Union[SpectralQty, Callable]
The spectral transmittance coefficients of the filter.
emissivity : Union[str, int, float]
emissivity : Union[str, float]
The spectral emissivity coefficient for the optical surface.
temp: Quantity in Kelvin / Celsius
Temperature of the optical component
@ -52,8 +53,8 @@ class Filter(AHotOpticalComponent):
@classmethod
# @u.quantity_input(temp=[u.Kelvin, u.Celsius], obstructor_temp=[u.Kelvin, u.Celsius])
def fromBand(cls, parent: IRadiant, band: str, emissivity: Union[str, int, float] = 1,
temp: u.Quantity = 0 * u.K, obstruction: float = 0, obstructor_temp: u.Quantity = 0 * u.K,
def fromBand(cls, parent: IRadiant, band: str, emissivity: Union[str, float] = 1, temp: u.Quantity = 0 * u.K,
obstruction: float = 0, obstructor_temp: u.Quantity = 0 * u.K,
obstructor_emissivity: float = 1) -> "Filter":
"""
Instantiate a new filter model from a spectral band. The filter will be modelled as bandpass filter of
@ -65,7 +66,7 @@ class Filter(AHotOpticalComponent):
The parent element of the optical component from which the electromagnetic radiation is received.
band : str
The spectral band of the filter. Can be one of [U, B, V, R, I, J, H, K].
emissivity : Union[str, int, float]
emissivity : Union[str, float]
The spectral emissivity coefficient for the optical surface.
temp: Quantity in Kelvin / Celsius
Temperature of the optical component
@ -92,7 +93,7 @@ class Filter(AHotOpticalComponent):
@classmethod
# @u.quantity_input(temp=[u.Kelvin, u.Celsius], obstructor_temp=[u.Kelvin, u.Celsius])
def fromFile(cls, parent: IRadiant, transmittance: str, emissivity: Union[str, int, float] = 1,
def fromFile(cls, parent: IRadiant, transmittance: str, emissivity: Union[str, float] = 1,
temp: u.Quantity = 0 * u.K, obstruction: float = 0, obstructor_temp: u.Quantity = 0 * u.K,
obstructor_emissivity: float = 1) -> "Filter":
"""
@ -105,7 +106,7 @@ class Filter(AHotOpticalComponent):
transmittance : str
Path to the file containing the spectral transmittance-coefficients of the filter element.
The format of the file will be guessed by `astropy.io.ascii.read()`.
emissivity : Union[str, int, float]
emissivity : Union[str, float]
The spectral emissivity coefficient for the optical surface.
temp: Quantity in Kelvin / Celsius
Temperature of the optical component
@ -129,9 +130,9 @@ class Filter(AHotOpticalComponent):
@classmethod
# @u.quantity_input(start="length", end="length", temp=[u.Kelvin, u.Celsius], obstructor_temp=[u.Kelvin, u.Celsius])
def fromRange(cls, parent: IRadiant, start: u.Quantity, end: u.Quantity,
emissivity: Union[str, int, float] = 1, temp: u.Quantity = 0 * u.K, obstruction: float = 0,
obstructor_temp: u.Quantity = 0 * u.K, obstructor_emissivity: float = 1) -> "Filter":
def fromRange(cls, parent: IRadiant, start: u.Quantity, end: u.Quantity, emissivity: Union[str, float] = 1,
temp: u.Quantity = 0 * u.K, obstruction: float = 0, obstructor_temp: u.Quantity = 0 * u.K,
obstructor_emissivity: float = 1) -> "Filter":
"""
Instantiate a new filter model from a spectral range. The filter will be modelled as bandpass filter of
infinite order and therefore similar to a hat-function.
@ -144,7 +145,7 @@ class Filter(AHotOpticalComponent):
Start wavelength of the pass-band
end : length-quantity
End wavelength of the pass-band
emissivity : Union[str, int, float]
emissivity : Union[str, float]
The spectral emissivity coefficient for the optical surface.
temp: Quantity in Kelvin / Celsius
Temperature of the optical component
@ -202,3 +203,54 @@ class Filter(AHotOpticalComponent):
"""
return lambda wl: np.logical_and(np.greater_equal(wl, start), np.greater_equal(end, wl)).astype(int) *\
u.dimensionless_unscaled
@staticmethod
def check_config(conf: Entry) -> Union[None, str]:
"""
Check the configuration for this class
Parameters
----------
conf : Entry
The configuration entry to be checked.
Returns
-------
mes : Union[None, str]
The error message of the check. This will be None if the check was successful.
"""
if hasattr(conf, "band"):
mes = conf.check_selection("band", ["U", "B", "V", "R", "I", "J", "H", "K", "L", "M", "N"])
elif hasattr(conf, "transmittance"):
mes = conf.check_file("transmittance")
elif hasattr(conf, "start") and hasattr(conf, "end"):
mes = conf.check_quantity("start", u.m)
if mes is not None:
return mes
mes = conf.check_quantity("end", u.m)
else:
mes = "Expected one of 'band' / 'transmittance' / 'start' & 'end'."
if mes is not None:
return mes
if hasattr(conf, "emissivity"):
mes = conf.check_file("emissivity")
if mes is not None:
mes = conf.check_float("emissivity")
if mes is not None:
return mes
if hasattr(conf, "temp"):
mes = conf.check_quantity("temp", u.K)
if mes is not None:
return mes
if hasattr(conf, "obstruction"):
mes = conf.check_float("obstruction")
if mes is not None:
return mes
if hasattr(conf, "obstructor_temp"):
mes = conf.check_quantity("obstructor_temp", u.K)
if mes is not None:
return mes
if hasattr(conf, "obstructor_emissivity"):
mes = conf.check_float("obstructor_emissivity")
if mes is not None:
return mes

View File

@ -1,6 +1,7 @@
from .AHotOpticalComponent import AHotOpticalComponent
from ..SpectralQty import SpectralQty
from ..IRadiant import IRadiant
from ..Entry import Entry
from astropy import units as u
from typing import Union
@ -10,9 +11,9 @@ class Lens(AHotOpticalComponent):
A class to model the optical characteristics of a lens.
"""
@u.quantity_input(temp=[u.Kelvin, u.Celsius], obstructor_temp=[u.Kelvin, u.Celsius])
def __init__(self, parent: IRadiant, transmittance: str,
emissivity: Union[int, float, str] = 1, temp: u.Quantity = 0 * u.K,
obstruction: float = 0, obstructor_temp: u.Quantity = 0 * u.K, obstructor_emissivity: float = 1):
def __init__(self, parent: IRadiant, transmittance: str, emissivity: Union[str, float] = 1,
temp: u.Quantity = 0 * u.K, obstruction: float = 0, obstructor_temp: u.Quantity = 0 * u.K,
obstructor_emissivity: float = 1):
"""
Instantiate a new lens model
@ -22,7 +23,7 @@ class Lens(AHotOpticalComponent):
The parent element of the optical component from which the electromagnetic radiation is received.
transmittance : str
The spectral transmittance coefficients of the filter.
emissivity : Union[int, float, str]
emissivity : Union[str, float]
The spectral emissivity coefficient for the optical surface.
temp: Quantity in Kelvin / Celsius
Temperature of the optical component
@ -54,3 +55,44 @@ class Lens(AHotOpticalComponent):
Manipulated incoming radiation
"""
return rad * self._transmittance
@staticmethod
def check_config(conf: Entry) -> Union[None, str]:
"""
Check the configuration for this class
Parameters
----------
conf : Entry
The configuration entry to be checked.
Returns
-------
mes : Union[None, str]
The error message of the check. This will be None if the check was successful.
"""
mes = conf.check_file("transmittance")
if mes is not None:
return mes
if hasattr(conf, "emissivity"):
mes = conf.check_file("emissivity")
if mes is not None:
mes = conf.check_float("emissivity")
if mes is not None:
return mes
if hasattr(conf, "temp"):
mes = conf.check_quantity("temp", u.K)
if mes is not None:
return mes
if hasattr(conf, "obstruction"):
mes = conf.check_float("obstruction")
if mes is not None:
return mes
if hasattr(conf, "obstructor_temp"):
mes = conf.check_quantity("obstructor_temp", u.K)
if mes is not None:
return mes
if hasattr(conf, "obstructor_emissivity"):
mes = conf.check_float("obstructor_emissivity")
if mes is not None:
return mes

View File

@ -1,6 +1,7 @@
from .AHotOpticalComponent import AHotOpticalComponent
from ..SpectralQty import SpectralQty
from ..IRadiant import IRadiant
from ..Entry import Entry
from astropy import units as u
from typing import Union
@ -10,9 +11,9 @@ class Mirror(AHotOpticalComponent):
A class to model the optical characteristics of a mirror.
"""
@u.quantity_input(temp=[u.Kelvin, u.Celsius], obstructor_temp=[u.Kelvin, u.Celsius])
def __init__(self, parent: IRadiant, reflectance: str,
emissivity: Union[int, float, str] = 1, temp: u.Quantity = 0 * u.K,
obstruction: float = 0, obstructor_temp: u.Quantity = 0 * u.K, obstructor_emissivity: float = 1):
def __init__(self, parent: IRadiant, reflectance: str, emissivity: Union[str, float] = 1,
temp: u.Quantity = 0 * u.K, obstruction: float = 0, obstructor_temp: u.Quantity = 0 * u.K,
obstructor_emissivity: float = 1):
"""
Instantiate a new mirror model
@ -22,7 +23,7 @@ class Mirror(AHotOpticalComponent):
The parent element of the optical component from which the electromagnetic radiation is received.
reflectance : str
The spectral transmittance coefficients of the filter.
emissivity : Union[int, float, str]
emissivity : Union[str, float]
The spectral emissivity coefficient for the optical surface.
temp: Quantity in Kelvin / Celsius
Temperature of the optical component
@ -54,3 +55,44 @@ class Mirror(AHotOpticalComponent):
Manipulated incoming radiation
"""
return rad * self._reflectance
@staticmethod
def check_config(conf: Entry) -> Union[None, str]:
"""
Check the configuration for this class
Parameters
----------
conf : Entry
The configuration entry to be checked.
Returns
-------
mes : Union[None, str]
The error message of the check. This will be None if the check was successful.
"""
mes = conf.check_file("reflectance")
if mes is not None:
return mes
if hasattr(conf, "emissivity"):
mes = conf.check_file("emissivity")
if mes is not None:
mes = conf.check_float("emissivity")
if mes is not None:
return mes
if hasattr(conf, "temp"):
mes = conf.check_quantity("temp", u.K)
if mes is not None:
return mes
if hasattr(conf, "obstruction"):
mes = conf.check_float("obstruction")
if mes is not None:
return mes
if hasattr(conf, "obstructor_temp"):
mes = conf.check_quantity("obstructor_temp", u.K)
if mes is not None:
return mes
if hasattr(conf, "obstructor_emissivity"):
mes = conf.check_float("obstructor_emissivity")
if mes is not None:
return mes

View File

@ -1,7 +1,9 @@
from .AOpticalComponent import AOpticalComponent
from ..IRadiant import IRadiant
from ..SpectralQty import SpectralQty
from ..Entry import Entry
import astropy.units as u
from typing import Union
class StrayLight(AOpticalComponent):
@ -27,3 +29,22 @@ class StrayLight(AOpticalComponent):
qty_unit_default=u.W / (u.m ** 2 * u.nm * u.sr))
# Initialize the super class
super().__init__(parent, 1.0, emission_sqty)
@staticmethod
def check_config(conf: Entry) -> Union[None, str]:
"""
Check the configuration for this class
Parameters
----------
conf : Entry
The configuration entry to be checked.
Returns
-------
mes : Union[None, str]
The error message of the check. This will be None if the check was successful.
"""
mes = conf.check_file("emission")
if mes is not None:
return mes

View File

@ -1,6 +1,8 @@
from ..IRadiant import IRadiant
import astropy.units as u
from abc import abstractmethod
from ..Entry import Entry
from typing import Union
class ASensor:
@ -52,3 +54,20 @@ class ASensor:
The necessary exposure time in seconds.
"""
pass
@staticmethod
def check_config(conf: Entry) -> Union[None, str]:
"""
Check the configuration for this class
Parameters
----------
conf : Entry
The configuration entry to be checked.
Returns
-------
mes : Union[None, str]
The error message of the check. This will be None if the check was succesful.
"""
pass

View File

@ -5,6 +5,7 @@ import astropy.units as u
import numpy as np
from logging import info, debug
from typing import Tuple
from ..Entry import Entry
class ATarget(IRadiant):
@ -59,3 +60,21 @@ class ATarget(IRadiant):
info("Calculating Signal for class '" + self.__class__.__name__ + "'.")
debug(self.__sfd)
return self.__sfd, self.__size
@staticmethod
@abstractmethod
def check_config(conf: Entry) -> bool:
"""
Check the configuration for this class
Parameters
----------
conf : Entry
The configuration entry to be checked.
Returns
-------
mes : Union[None, str]
The error message of the check. This will be None if the check was successful.
"""
pass

View File

@ -3,6 +3,8 @@ from ..SpectralQty import SpectralQty
import astropy.units as u
from astropy.modeling.models import BlackBody
from ...lib.helpers import error
from ..Entry import Entry
from typing import Union
class BlackBodyTarget(ATarget):
@ -44,16 +46,44 @@ class BlackBodyTarget(ATarget):
Returns
-------
"""
if band 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())) + "]'")
# Create blackbody model with given temperature
bb = BlackBody(temperature=temp, scale=1 * u.W / (u.m ** 2 * u.nm * u.sr))
# Calculate the correction factor for a star of 0th magnitude using the spectral flux density
# for the central wavelength of the given band
factor = self._band[band]["sfd"] / (bb(self._band[band]["wl"]) * u.sr) * u.sr
factor = self._band[band.upper()]["sfd"] / (bb(self._band[band.upper()]["wl"]) * u.sr) * u.sr
# Calculate spectral flux density for the given wavelengths and scale it for a star of the given magnitude
sfd = bb(wl_bins) * factor * 10 ** (- 2 / 5 * mag / u.mag)
# Initialize super class
super().__init__(SpectralQty(wl_bins, sfd), wl_bins, size)
@staticmethod
def check_config(conf: Entry) -> Union[None, str]:
"""
Check the configuration for this class
Parameters
----------
conf : Entry
The configuration entry to be checked.
Returns
-------
mes : Union[None, str]
The error message of the check. This will be None if the check was successful.
"""
mes = conf.check_quantity("temp", u.K)
if mes is not None:
return mes
mes = conf.check_quantity("mag", u.mag)
if mes is not None:
return mes
mes = conf.check_selection("band", ["U", "B", "V", "R", "I", "J", "H", "K", "L", "M", "N"])
if mes is not None:
return mes
mes = conf.check_selection("size", ["point", "extended"])
if mes is not None:
return mes

View File

@ -1,6 +1,9 @@
from ..target.ATarget import ATarget
from ..SpectralQty import SpectralQty
import astropy.units as u
from ..Entry import Entry
from typing import Union
import os.path
class FileTarget(ATarget):
@ -29,3 +32,28 @@ class FileTarget(ATarget):
sfd = SpectralQty.fromFile(file, u.nm, u.W / (u.m ** 2 * u.nm))
# Initialize the super class
super().__init__(sfd, wl_bins, size)
@staticmethod
def check_config(conf: Entry) -> Union[None, str]:
"""
Check the configuration for this class
Parameters
----------
conf : Entry
The configuration entry to be checked.
Returns
-------
mes : Union[None, str]
The error message of the check. This will be None if the check was successful.
"""
mes = conf.check_file("file")
if mes is not None:
return mes
mes = conf.check_quantity("wl_bins", u.m)
if mes is not None:
return mes
mes = conf.check_selection("size", ["point", "extended"])
if mes is not None:
return mes