Source code for act.retrievals.aeri
"""
Functions for aeri retrievals.
"""
import numpy as np
from scipy.optimize import brentq
from act.retrievals.irt import irt_response_function, sum_function_irt
[docs]def aeri2irt(
aeri_ds,
wnum_name='wnum',
rad_name='mean_rad',
hatch_name='hatchOpen',
tolerance=0.1,
temp_low=150.0,
temp_high=320.0,
maxiter=200,
):
"""
This function will integrate over the correct wavenumber values to produce
the effective IRT temperature.
As a note from the ARM IRT Instrument Handbook
A positive bias of the sky temperature is exhibited by the downwelling IRT,
compared to the AERI, during clear-sky conditions when the sky temperature
is less than ~180K. The effect depends on the characteristics of the
individual IRT and the internal reference temperature of the IRT. The
greatest difference compared to AERI will occur when the sky is very clear,
dry, and cold and the ambient temperature is relatively hot, maximizing the
difference in temperature between the sky and instrument, and the
calibration of the IRT at the lower limit of 223K was not performed
accurately. This bias is especially apparent at high-latitude sites
(e.g., NSA, OLI, and AWR).
https://www.arm.gov/publications/tech_reports/handbooks/irt_handbook.pdf
Author - Ken Kehoe
Parameters
----------
aeri_ds : xarray.Dataset
The xarray dataset containing AERI data.
wnum_name : str
The variable name for coordinate dimention of wave number Xarray Dataset.
hatch_name : str or None
The variable name for hatch status. If set to None will not try to set
when hatch is not opent to NaN.
rad_name : str
The variable name for mean radiance in Xarray Dataset.
tolerance : float
The tolerance value to try and match for returned temperature.
temp_low : float
The initial low value to use in zbren function to invert radiances.
temp_high : float
The initial low value to use in zbren function to invert radiances.
maxiter : int
The maximum number if iterations to use with invertion process.
Prevents runaway processes.
Returns
-------
ds : xarray.Dataset or None
The aeri_ds Dataset with new DataArray of temperatures added under
variable name 'aeri_irt_equiv_temperature'.
"""
# Get data values
rf_wnum, rf = irt_response_function()
wnum = aeri_ds[wnum_name].values
mean_rad = aeri_ds[rad_name].values
# Pull out AERI data for correct wavenumbers and apply response function --;
index = np.where((wnum >= (rf_wnum[0] - 0.001)) & (wnum <= (rf_wnum[-1] + 0.001)))[0]
if index.size == 0:
raise ValueError('No wavenumbers match for aeri2irt')
wnum = wnum[index]
mean_rad = mean_rad[:, index]
# If the wavenumbers in AERI data are not close enough to response function
# match the wavenumbers and adjust.
atol = 0.001
if not np.all(np.isclose(wnum, rf_wnum, atol=atol)):
index_wnum = []
index_rf = []
for ii in range(wnum.size):
idx = (np.abs(wnum[ii] - rf_wnum)).argmin()
if np.isclose(wnum[ii], rf_wnum[idx], atol=atol):
index_wnum.append(ii)
index_rf.append(idx)
mean_rad = mean_rad[:, index_wnum]
rf = rf[index_rf]
# Apply response function to AERI radiance
mean_rad = mean_rad * rf
# Sum along wavenumber dimention to get a single value for each time step
mean_rad = np.nansum(mean_rad, axis=1)
# Loop over each time step of the AERI data and through the use of
# solving for zero determine the AERI equivlante IRT sky temperature.
aeri_irt_vals = np.full(mean_rad.size, np.nan, dtype=mean_rad.dtype)
# Look for when the hatch is not in Open position and set values to NaN.
if hatch_name is not None:
flag_values = aeri_ds[hatch_name].attrs['flag_values']
flag_meanings = aeri_ds[hatch_name].attrs['flag_meanings']
if not isinstance(flag_meanings, list):
flag_meanings = flag_meanings.split()
flag_meanings = [att.lower() for att in flag_meanings]
if not isinstance(flag_values, list):
flag_values = flag_values.split()
flag_values = [int(att) for att in flag_values]
value = flag_values[flag_meanings.index('open')]
mean_rad[aeri_ds[hatch_name].values != value] = np.nan
for ii in range(mean_rad.size):
if np.isnan(mean_rad[ii]):
continue
else:
try:
aeri_irt_vals[ii] = brentq(
sum_function_irt,
temp_low,
temp_high,
args=(mean_rad[ii],),
xtol=tolerance,
maxiter=maxiter,
)
except ValueError:
pass
# Add new values to Xarray Dataset
aeri_ds['aeri_irt_equiv_temperature'] = (
'time',
aeri_irt_vals,
{'long_name': 'Derived IRT equivalent temperatrues from AERI', 'units': 'K'},
)
return aeri_ds