calculate signal and noise

This commit is contained in:
Lukas Klass 2020-04-09 17:51:55 +02:00
parent bcb610febe
commit 36097dbeb8
2 changed files with 63 additions and 6 deletions

View File

@ -1,7 +1,9 @@
from ..ITransmissive import ITransmissive from ..ITransmissive import ITransmissive
from abc import abstractmethod from abc import abstractmethod
from ..SpectralQty import SpectralQty from ..SpectralQty import SpectralQty
import copy from esbo_etc.lib.helpers import error
import astropy.units as u
from astropy.modeling.models import BlackBody
class AOpticalComponent(ITransmissive): class AOpticalComponent(ITransmissive):
@ -10,8 +12,10 @@ class AOpticalComponent(ITransmissive):
""" """
@abstractmethod @abstractmethod
@u.quantity_input(obstructor_temp=[u.K, u.Celsius])
def __init__(self, parent: ITransmissive, transreflectivity: SpectralQty = None, def __init__(self, parent: ITransmissive, transreflectivity: SpectralQty = None,
noise: SpectralQty = None, obstruction: float = 0): noise: SpectralQty = None, obstruction: float = 0, obstructor_temp: u.Quantity = 0 * u.K,
obstructor_emissivity: float = 0):
""" """
Initialize a new optical component Initialize a new optical component
@ -31,6 +35,10 @@ class AOpticalComponent(ITransmissive):
denotes a completely obstructed component with therefore no incoming flux. It is important to note, that 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 the obstruction factor reflects the obstruction of the optical component additionally to the obstruction
factors of the prior elements in the beam. 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._parent = parent self._parent = parent
if transreflectivity: if transreflectivity:
@ -38,6 +46,8 @@ class AOpticalComponent(ITransmissive):
if noise: if noise:
self._noise = noise self._noise = noise
self._obstruction = obstruction self._obstruction = obstruction
self._obstructor_temp = obstructor_temp
self._obstructor_emissivity = obstructor_emissivity
def calcSignal(self) -> SpectralQty: def calcSignal(self) -> SpectralQty:
""" """
@ -48,7 +58,7 @@ class AOpticalComponent(ITransmissive):
signal : SpectralQty signal : SpectralQty
The spectral flux density of the target's signal The spectral flux density of the target's signal
""" """
return self.propagate(copy.deepcopy(self._parent.calcSignal())).multiply(1 - self._obstruction) return self.propagate(self._parent.calcSignal()) * (1 - self._obstruction)
def calcNoise(self) -> SpectralQty: def calcNoise(self) -> SpectralQty:
""" """
@ -59,7 +69,13 @@ class AOpticalComponent(ITransmissive):
noise : SpectralQty noise : SpectralQty
The spectral radiance of the target's noise The spectral radiance of the target's noise
""" """
return self.propagate(copy.deepcopy(self._parent.calcNoise())).add(self.ownNoise()) parent = self.propagate(self._parent.calcNoise())
if self._obstructor_temp > 0 * u.K:
bb = BlackBody(temperature=self._obstructor_temp, scale=1. * u.W / (u.m ** 2 * u.nm * u.sr))
obstructor = bb(parent.wl) * self._obstructor_emissivity
return parent * (1. - self._obstruction) + obstructor * self._obstruction + self.ownNoise()
else:
return parent * (1. - self._obstruction) + self.ownNoise()
def propagate(self, sqty: SpectralQty) -> SpectralQty: def propagate(self, sqty: SpectralQty) -> SpectralQty:
""" """
@ -75,7 +91,10 @@ class AOpticalComponent(ITransmissive):
sqty : SpectralQty sqty : SpectralQty
Manipulated incoming radiation Manipulated incoming radiation
""" """
return sqty.multiply(self._transreflectivity) if hasattr(self, "_transreflectivity"):
return sqty * self._transreflectivity
else:
error("Transreflectivity not given. Method propagate() needs to be implemented.")
def ownNoise(self) -> SpectralQty: def ownNoise(self) -> SpectralQty:
""" """
@ -86,4 +105,7 @@ class AOpticalComponent(ITransmissive):
sqty : SpectralQty sqty : SpectralQty
The noise created by the optical component The noise created by the optical component
""" """
return self._noise if hasattr(self, "_noise"):
return self._noise
else:
error("noise not given. Method ownNoise() needs to be implemented.")

View File

@ -0,0 +1,35 @@
from unittest import TestCase
from esbo_etc.classes import *
import astropy.units as u
import numpy as np
class OpticalComponent(AOpticalComponent):
def __init__(self, parent: ITransmissive, transreflectivity: SpectralQty = None,
noise: SpectralQty = None, obstruction: float = 0, obstructor_temp: u.Quantity = 0 * u.K,
obstructor_emissivity: float = 0):
super().__init__(parent, transreflectivity, noise, obstruction, obstructor_temp, obstructor_emissivity)
class TestAOpticalComponent(TestCase):
wl = np.arange(4, 8, 1) << u.um
def setUp(self):
self.target = BlackBodyTarget(self.wl, temp=5778 * u.K, mag=10 * u.mag, band="U")
self.comp = OpticalComponent(self.target, SpectralQty(self.wl, [0.5] * 4),
SpectralQty(self.wl, [1e-5] * 4 << u.W / (u.m ** 2 * u.nm * u.sr)),
obstruction=0.1, obstructor_temp=300 * u.K, obstructor_emissivity=1)
def test_calcSignal(self):
self.assertEqual(self.comp.calcSignal(), SpectralQty(self.wl, [1.25575776e-17, 5.50570557e-18, 2.77637739e-18,
1.54664415e-18] << u.W / (u.m ** 2 * u.nm)))
def test_calcNoise(self):
self.assertEqual(self.comp.calcNoise(),
SpectralQty(self.wl, [8.21976423e-05, 2.70268340e-04, 5.27503292e-04,
7.60597616e-04] << u.W / (u.m ** 2 * u.nm * u.sr)))
comp = OpticalComponent(self.comp, SpectralQty(self.wl, [0.5] * 4),
SpectralQty(self.wl, [0] * 4 << u.W / (u.m ** 2 * u.nm * u.sr)),
obstruction=0.1, obstructor_temp=300 * u.K, obstructor_emissivity=1)
self.assertEqual(comp.calcNoise(), SpectralQty(self.wl, [1.09186581e-04, 3.81889092e-04, 7.54879773e-04,
10.92866544e-04] << u.W / (u.m ** 2 * u.nm * u.sr)))