From 3fdc3a1a084b149d252bc0a092697d8b97aa11b2 Mon Sep 17 00:00:00 2001 From: LukasK13 Date: Wed, 15 Apr 2020 17:11:36 +0200 Subject: [PATCH] Lens added --- esbo_etc/classes/optical_component/Lens.py | 56 ++++++++++++++++++++++ tests/data/lens/lens_transmittance.csv | 5 ++ tests/test_Lens.py | 21 ++++++++ 3 files changed, 82 insertions(+) create mode 100644 esbo_etc/classes/optical_component/Lens.py create mode 100644 tests/data/lens/lens_transmittance.csv create mode 100644 tests/test_Lens.py diff --git a/esbo_etc/classes/optical_component/Lens.py b/esbo_etc/classes/optical_component/Lens.py new file mode 100644 index 0000000..c643306 --- /dev/null +++ b/esbo_etc/classes/optical_component/Lens.py @@ -0,0 +1,56 @@ +from .AHotOpticalComponent import AHotOpticalComponent +from ..SpectralQty import SpectralQty +from ..ITransmissive import ITransmissive +from astropy import units as u +from typing import Union + + +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: ITransmissive, 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): + """ + Instantiate a new lens model + + Parameters + ---------- + parent : ITransmissive + 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] + The spectral emissivity coefficient for the optical surface. + temp: Quantity in Kelvin / Celsius + Temperature of the optical component + obstruction : float + The additional obstruction factor of the optical component. 0 means the component is not obstructed, 1 + denotes a completely obstructed component with therefore no incoming flux. It is important to note, that + the obstruction factor reflects the obstruction of the optical component additionally to the obstruction + factors of the prior elements in the beam. + obstructor_temp : Quantity in Kelvin / Celsius + Temperature of the obstructing component. + obstructor_emissivity : float + Emissivity of the obstructing component. + """ + self._transmittance = SpectralQty.fromFile(transmittance, u.nm, u.dimensionless_unscaled) + super().__init__(parent, emissivity, temp, obstruction, obstructor_temp, obstructor_emissivity) + + def propagate(self, sqty: SpectralQty) -> SpectralQty: + """ + Propagate incoming radiation through the optical component + + Parameters + ---------- + sqty : SpectralQty + The incoming radiation + + Returns + ------- + sqty : SpectralQty + Manipulated incoming radiation + """ + return sqty * self._transmittance diff --git a/tests/data/lens/lens_transmittance.csv b/tests/data/lens/lens_transmittance.csv new file mode 100644 index 0000000..e12aeac --- /dev/null +++ b/tests/data/lens/lens_transmittance.csv @@ -0,0 +1,5 @@ +wavelength,spectral transmittance +201,1 +202,1 +203,1 +204,0.9 diff --git a/tests/test_Lens.py b/tests/test_Lens.py new file mode 100644 index 0000000..71d12ab --- /dev/null +++ b/tests/test_Lens.py @@ -0,0 +1,21 @@ +from unittest import TestCase +from esbo_etc.classes.optical_component.Lens import Lens +from esbo_etc.classes.SpectralQty import SpectralQty +from esbo_etc.classes.target.FileTarget import FileTarget +import astropy.units as u +import numpy as np + + +class TestLens(TestCase): + wl = np.arange(201, 205, 1) << u.nm + + def setUp(self): + self.target = FileTarget("data/target/target_demo_1.csv") + self.lens = Lens(self.target, "data/lens/lens_transmittance.csv", 0.5, temp=300 * u.K) + + def test___init__(self): + self.assertEqual(self.lens.calcNoise(), + SpectralQty(self.wl, [4.31413931e-96, 1.37122214e-95, 4.30844544e-95, 1.33846280e-94] << u.W / + (u.m ** 2 * u.nm * u.sr))) + self.assertEqual(self.lens.calcSignal(), + SpectralQty(self.wl, [1.20e-15, 1.30e-15, 1.40e-15, 1.35e-15] << u.W / (u.m ** 2 * u.nm)))