Source code for deshima_sensitivity.physics
# standard library
from typing import List, Union
# dependent packages
import numpy as np
# type aliases
ArrayLike = Union[np.ndarray, List[float], List[int], float, int]
# constants
h = 6.62607004 * 10**-34 # Planck constant
k = 1.38064852 * 10**-23 # Boltzmann constant
e = 1.60217662 * 10**-19 # electron charge
c = 299792458.0 # velocity of light
# main functions
[docs]def rad_trans(rad_in: ArrayLike, medium: ArrayLike, eta: ArrayLike) -> ArrayLike:
"""Calculates radiation transfer through a semi-transparent medium.
One can also use the same function for Johnson-Nyquist PSD
(power spectral density) instead of temperature.
Parameters
----------
rad_in
Brightness temperature (or PSD) of the input. Units: K (or W/Hz).
medium
Brightness temperature (or PSD) of the lossy medium. Units: K (or W/Hz).
eta
Transmission of the lossy medium. Units: K (or W/Hz).
Returns
-------
rad_out
Brightness temperature (or PSD) of the output.
"""
return eta * rad_in + (1 - eta) * medium
[docs]def T_from_psd(F: ArrayLike, psd: ArrayLike, method: str = "Planck") -> ArrayLike:
"""Calculate Planck temperature from the PSD frequency (frequencies).
Parameters
----------
F
Frequency. Units: Hz.
psd
Power Spectral Density. Units: W / Hz.
method
Default: 'Planck'. Option: 'Rayleigh-Jeans'.
Returns
--------
T
Planck temperature. Units: K.
"""
if method == "Planck":
return h * F / (k * np.log(h * F / psd + 1.0))
elif method == "Rayleigh-Jeans":
return psd / k
else:
raise ValueError("Method should be Planck or Rayleigh-Jeans.")
[docs]def johnson_nyquist_psd(F: ArrayLike, T: ArrayLike) -> ArrayLike:
"""Johnson-Nyquist power spectral density.
Don't forget to multiply with bandwidth to caculate the total power in W.
Parameters
----------
F
Frequency. Units: Hz.
T
Temperature. Units: K.
Returns
--------
psd
Power Spectral Density. Units: W / Hz.
"""
return h * F * nph(F, T)
# helper functions
[docs]def nph(F: ArrayLike, T: ArrayLike) -> ArrayLike:
"""Photon occupation number of Bose-Einstein Statistics.
If it is not single temperature, use nph = Pkid / (W_F * h * F).
Parameters
----------
F
Frequency. Units: Hz.
T
Temperature. Units: K.
Returns
--------
n
Photon occupation number. Units: None.
"""
return 1.0 / (np.exp(h * F / (k * T)) - 1.0)