Skip to content
Snippets Groups Projects
main.py 3.17 KiB
Newer Older
Coda Phillips's avatar
Coda Phillips committed
import os
from glob import glob
import re
Coda Phillips's avatar
Coda Phillips committed
import netCDF4
from aeri_tools.io.dmv.housekeeping import get_all_housekeeping
Coda Phillips's avatar
Coda Phillips committed

import electronic_checks
import global_checks
import radiometric_checks
import scene_checks
import state_checks
import thermal_checks

levels = [
    global_checks.CheckList(),
    scene_checks.CheckList(),
    state_checks.CheckList(), 
    electronic_checks.CheckList(),
    radiometric_checks.CheckList(),
    thermal_checks.CheckList()
]

Coda Phillips's avatar
Coda Phillips committed
def save_quality(frame, qc_path):
    ncdf = netCDF4.Dataset(qc_path, 'w')
    time = ncdf.createDimension('time', len(frame))
    base_time = ncdf.createVariable('base_time', 'i8', ())
    time_offset = ncdf.createVariable('time_offset', 'i8', ('time',))
Coda Phillips's avatar
Coda Phillips committed
    qc_percent = ncdf.createVariable('qc_percent', 'f4', ('time',))
    qc_notes = ncdf.createVariable('qc_notes', str, ('time',))
    for check_mask in frame.filter(like='_check'):
Coda Phillips's avatar
Coda Phillips committed
        ncdf.createVariable(check_mask, 'f4', ('time',))[:] = frame[check_mask].values
    for variable_qc in frame.filter(like='qc_'):
        if variable_qc not in ['qc_notes','qc_percent']:
            ncdf.createVariable(variable_qc, 'f4', ('time',))[:] = frame[variable_qc].values
    base_time[:] = frame.datetime.dropna().iloc[0].to_datetime64()
    time_offset[:] = (frame.datetime - frame.datetime.dropna().iloc[0]).values
Coda Phillips's avatar
Coda Phillips committed
    qc_percent[:] = frame['qc_percent'].values
    qc_notes[:] = frame['qc_notes'].fillna('').values
    ncdf.close()
    

Coda Phillips's avatar
Coda Phillips committed
def read_frame(cxs_file, sum_file):
Coda Phillips's avatar
Coda Phillips committed
    hk = get_all_housekeeping(cxs_file).combine_first(
Coda Phillips's avatar
Coda Phillips committed
        get_all_housekeeping(sum_file))
Coda Phillips's avatar
Coda Phillips committed
    hk.index.name = 'datetime'
    return hk.reset_index()

def check_frame(frame, parameters):
    frame['qc_percent'] = 0
Coda Phillips's avatar
Coda Phillips committed
    frame['qc_notes'] = None
    for level in levels:
        level.set_params(parameters)
        frame = level.compute(frame)
    return frame
Coda Phillips's avatar
Coda Phillips committed

def update_all(ftp_dir, parameters=None):
Coda Phillips's avatar
Coda Phillips committed
    cxs_files = glob(os.path.join(os.path.abspath(ftp_dir),'AE*','*B1.CXS'))
Coda Phillips's avatar
Coda Phillips committed
    for qc_file, cxs_file, sum_file in files_to_update(cxs_files):
Coda Phillips's avatar
Coda Phillips committed
        print('Performing quality control for {}'.format(cxs_file))
        frame = read_frame(cxs_file, sum_file)
Coda Phillips's avatar
Coda Phillips committed
        if parameters is None:
            parameters = {}
Coda Phillips's avatar
Coda Phillips committed
        frame = check_frame(frame, parameters)
        save_quality(frame, qc_file)
def files_to_update(cxs_files, update_only=True):
Coda Phillips's avatar
Coda Phillips committed
    for cxs_file in cxs_files:
        possible_sum = os.path.join(os.path.dirname(cxs_file), cxs_file.replace('B1.CXS','.SUM'))
        possible_qc = os.path.join(os.path.dirname(cxs_file), cxs_file.replace('B1.CXS','.qc'))

        if os.path.isfile(possible_sum):
            sum_file = possible_sum

            if os.path.isfile(possible_qc):
                qc_file = possible_qc
                if max(os.path.getmtime(sum_file), os.path.getmtime(cxs_file)) > os.path.getmtime(qc_file):
                    yield (qc_file, cxs_file, sum_file)
                elif not update_only:
                    yield (qc_file, cxs_file, sum_file)
Coda Phillips's avatar
Coda Phillips committed
            else:
Coda Phillips's avatar
Coda Phillips committed
                yield (possible_qc, cxs_file, sum_file)
Coda Phillips's avatar
Coda Phillips committed

if __name__ == '__main__':
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('ftp')

    args = parser.parse_args()

    update_all(args.ftp)