Skip to content
Snippets Groups Projects
radiometric_checks.py 3.66 KiB
Newer Older
Coda Phillips's avatar
Coda Phillips committed
from aeri_qc.util import _compute_robust_zscore
import pandas as pd
import numpy as np
import scipy.stats
Coda Phillips's avatar
Coda Phillips committed
from aeri_qc.all_checks import checklist
hide_data_if_invalid = [
    'hbb_temp_outlier_check',
    'abb_temp_outlier_check',
    'hatch_check',
    'safing_check',
    'detector_check',
    'hbb_thermistor_check',
    'abb_thermistor_check',
    'hbb_stable_check',
    'hbb_covariance_check'
]

@checklist.add_check(depends=['skyViewImaginaryRadiance2510_2515'], affects_calibration=False, description='sky view imaginary radiance is out of range', hides=hide_data_if_invalid)
def imaginary_radiance_check(frame, parameters):
    threshold = parameters.get('imaginary_radiance_threshold', 1)
Coda Phillips's avatar
Coda Phillips committed
    return abs(frame.skyViewImaginaryRadiance2510_2515) > threshold
@checklist.add_check(depends=['HBBviewStdDevRadiance985_990'], affects_calibration=True, description='HBB radiance has too much variance', hides=hide_data_if_invalid)
Coda Phillips's avatar
Coda Phillips committed
def hbb_std_dev_check(frame, parameters):
    hbb_std_dist = scipy.stats.chi2.fit(frame.HBBviewStdDevRadiance985_990)
    _, hbb_std_dist_hi = scipy.stats.chi2.interval(.995, *hbb_std_dist)
Coda Phillips's avatar
Coda Phillips committed
    return frame.HBBviewStdDevRadiance985_990 > hbb_std_dist_hi
@checklist.add_check(depends=['LW_HBB_NEN'], affects_calibration=True, description='Longwave HBB radiance NEN too high', hides=hide_data_if_invalid)
Coda Phillips's avatar
Coda Phillips committed
def hbb_lw_nen_check(frame, parameters):
    lw_hbb_nen_dist = scipy.stats.chi2.fit(frame.LW_HBB_NEN)
    _, lw_hbb_nen_hi = scipy.stats.chi2.interval(.995, *lw_hbb_nen_dist)
Coda Phillips's avatar
Coda Phillips committed
    return frame.LW_HBB_NEN > lw_hbb_nen_hi
@checklist.add_check(depends=['SW_HBB_NEN'], affects_calibration=True, description='Shortwave HBB radiance NEN too high', hides=hide_data_if_invalid)
Coda Phillips's avatar
Coda Phillips committed
def hbb_sw_nen_check(frame, parameters):
    sw_hbb_nen_dist = scipy.stats.chi2.fit(frame.SW_HBB_NEN)
    _, sw_hbb_nen_hi = scipy.stats.chi2.interval(.995, *sw_hbb_nen_dist)
Coda Phillips's avatar
Coda Phillips committed
    return frame.SW_HBB_NEN > sw_hbb_nen_hi
@checklist.add_check(depends=['LWresponsivity'], affects_calibration=False, description='Longwave responsivity outlier', hides=hide_data_if_invalid)
Coda Phillips's avatar
Coda Phillips committed
def lw_responsivity_check(frame, parameters):
    lw_zscore = _compute_robust_zscore(frame['LWresponsivity'], 50)
Coda Phillips's avatar
Coda Phillips committed
    return abs(lw_zscore) > 6

@checklist.add_check(depends=['SWresponsivity'], affects_calibration=False, description='Shortwave responsivity outlier', hides=hide_data_if_invalid)
Coda Phillips's avatar
Coda Phillips committed
def sw_responsivity_check(frame, parameters):
    sw_zscore = _compute_robust_zscore(frame['SWresponsivity'], 50)
Coda Phillips's avatar
Coda Phillips committed
    return abs(sw_zscore) > 6
@checklist.add_check(depends=['surfaceLayerAirTemp675_680', 'BBsupportStructureTemp', 'airNearBBsTemp'], affects_calibration=True, description='brightness temp @675cm-1 within 5K of BBsupportStruct/AirNearBBsTemp', hides=hide_data_if_invalid)
def sky_brightness_temp_spectral_averages_ch1_check(frame, parameters):
    temps = frame['surfaceLayerAirTemp675_680'].copy()
    for x, temp in temps.iteritems():
        if(abs(temp - frame['BBsupportStructureTemp'][x]) >= 20 or abs(temp - frame['airNearBBsTemp'][x]) >= 20):
            temps.loc[x] = 1
        else:
            temps.loc[x] = 0
    return temps

@checklist.add_check(depends=['surfaceLayerAirTemp2295_2300', 'BBsupportStructureTemp', 'airNearBBsTemp'], affects_calibration=True, description='brightness temp @2300cm-1 within 5K of BBsupportStruct/AirNearBBsTemp', hides=hide_data_if_invalid)
def sky_brightness_temp_spectral_averages_ch2_check(frame, parameters):
    temps = frame['surfaceLayerAirTemp2295_2300'].copy()
    for x, temp in temps.iteritems():
        if(abs(temp - frame['BBsupportStructureTemp'][x]) >= 20 or abs(temp - frame['airNearBBsTemp'][x]) >= 20):
            temps.loc[x] = 1
        else:
            temps.loc[x] = 0
    return temps