Skip to content
Snippets Groups Projects
electronic_checks.py 2.18 KiB
Newer Older
import numpy as np
import pandas as pd
import itertools
Coda Phillips's avatar
Coda Phillips committed
from aeri_qc.all_checks import checklist
Coda Phillips's avatar
Coda Phillips committed
######### CHECKS ###########
@checklist.add_check(depends=['datetime','HBBapexTemp','HBBbottomTemp','HBBtopTemp' ], affects_calibration=True, hides=['missing_data_flag_check','hbb_stable_check','hbb_thermistor_check'], description='outlier in HBB temperature discovered')
Coda Phillips's avatar
Coda Phillips committed
def hbb_temp_outlier_check(frame, parameters):
    return find_bb_outliers(frame, parameters, 'HBB')

@checklist.add_check(depends=['datetime','ABBapexTemp','ABBbottomTemp','ABBtopTemp' ], affects_calibration=True, hides=['missing_data_flag_check'], description='outlier in ABB temperature discovered')
Coda Phillips's avatar
Coda Phillips committed
def abb_temp_outlier_check(frame, parameters):
    return find_bb_outliers(frame, parameters, 'ABB')
    

###### UTILTIY #############
def find_bb_outliers(frame, parameters, bb):
    """
    Find outliers in blackbody temperatures.
    Annotate any problems, and set quality flags for each thermistor
    """
    window_length = parameters.get('window_length', 50)
    if bb == 'HBB':
        delta_thresh = .001
        delta_thresh = .01
    bbb_outliers = np.array(list(_scan_for_outliers(frame, '{}bottomTemp'.format(bb), delta_thresh)))
    bba_outliers = np.array(list(_scan_for_outliers(frame, '{}apexTemp'.format(bb), delta_thresh)))
    bbt_outliers = np.array(list(_scan_for_outliers(frame, '{}topTemp'.format(bb), delta_thresh)))
Coda Phillips's avatar
Coda Phillips committed
    return ( bbb_outliers | bba_outliers | bbt_outliers )

def _scan_for_outliers(frame, variable, delta_thresh):
    """
    Check for temperature changes exceeding the delta_thresh rate in degK / sec
    """
    last = None
    for i, row in frame.iterrows():
        if pd.isnull(row).any():
            yield False
        # First row cannot be an outlier
        elif last is None:
            yield False
            last = row
        else:
            # Compare each row to previous non-outlier row
            time_diff = (row.datetime - last.datetime).total_seconds()
            variable_diff = row[variable] - last[variable]
            if abs(variable_diff / time_diff) < delta_thresh:
                yield False
                last = row
            else:
                yield True