Skip to content
Snippets Groups Projects
viirs_surfrad.py 13.2 KiB
Newer Older
tomrink's avatar
tomrink committed
import numpy as np
import h5py
tomrink's avatar
tomrink committed
from util.util import get_grid_values, is_day
tomrink's avatar
tomrink committed
import glob

tomrink's avatar
tomrink committed
keep_out_opd = ['/ships19/cloud/scratch/cphillips/clavrx/run_viirs_superres/sites_super_l2/arm/2019/11/02/clavrx_VNP02IMG.A2019306.1912.001.2019307003236.uwssec.nc',
                '/ships19/cloud/scratch/cphillips/clavrx/run_viirs_superres/sites_super_l2/arm/2019/04/13/clavrx_VNP02IMG.A2019103.1918.001.2019104005120.uwssec.nc',
                '/ships19/cloud/scratch/cphillips/clavrx/run_viirs_superres/sites_super_l2/sioux_falls/2019/05/25/clavrx_VNP02IMG.A2019145.1936.001.2019146005424.uwssec.nc',
                '/ships19/cloud/scratch/cphillips/clavrx/run_viirs_superres/sites_super_l2/sioux_falls/2019/11/01/clavrx_VNP02IMG.A2019305.1936.001.2019306005913.uwssec.nc',
                '/ships19/cloud/scratch/cphillips/clavrx/run_viirs_superres/sites_super_l2/sioux_falls/2019/03/01/clavrx_VNP02IMG.A2019060.1930.001.2019061005942.uwssec.nc',
                '/ships19/cloud/scratch/cphillips/clavrx/run_viirs_superres/sites_super_l2/table_mountain/2019/12/01/clavrx_VNP02IMG.A2019335.2012.001.2019336013827.uwssec.nc',
                '/ships19/cloud/scratch/cphillips/clavrx/run_viirs_superres/sites_super_l2/table_mountain/2019/05/18/clavrx_VNP02IMG.A2019138.2006.001.2019139013059.uwssec.nc',
                '/ships19/cloud/scratch/cphillips/clavrx/run_viirs_superres/sites_super_l2/fort_peck/2019/01/28/clavrx_VNP02IMG.A2019028.1930.001.2019029005408.uwssec.nc',
                '/ships19/cloud/scratch/cphillips/clavrx/run_viirs_superres/sites_super_l2/fort_peck/2019/08/08/clavrx_VNP02IMG.A2019220.1930.001.2019221010714.uwssec.nc',
                '/ships19/cloud/scratch/cphillips/clavrx/run_viirs_superres/sites_super_l2/madison/2019/10/13/clavrx_VNP02IMG.A2019286.1848.001.2019287001722.uwssec.nc',
                '/ships19/cloud/scratch/cphillips/clavrx/run_viirs_superres/sites_super_l2/madison/2019/03/20/clavrx_VNP02IMG.A2019079.1830.001.2019079235918.uwssec.nc',
                '/ships19/cloud/scratch/cphillips/clavrx/run_viirs_superres/sites_super_l2/madison/2019/12/26/clavrx_VNP02IMG.A2019360.1900.001.2019361001327.uwssec.nc',
                '/ships19/cloud/scratch/cphillips/clavrx/run_viirs_superres/sites_super_l2/desert_rock/2019/02/05/clavrx_VNP02IMG.A2019036.2018.001.2019037030301.uwssec.nc',
                '/ships19/cloud/scratch/cphillips/clavrx/run_viirs_superres/sites_super_l2/desert_rock/2019/03/30/clavrx_VNP02IMG.A2019089.2024.001.2019090015614.uwssec.nc',
                '/ships19/cloud/scratch/cphillips/clavrx/run_viirs_superres/sites_super_l2/bondville_il/2019/11/03/clavrx_VNP02IMG.A2019307.1854.001.2019308001716.uwssec.nc',
                '/ships19/cloud/scratch/cphillips/clavrx/run_viirs_superres/sites_super_l2/goodwin_creek/2019/04/15/clavrx_VNP02IMG.A2019105.1842.001.2019106001003.uwssec.nc',
                '/ships19/cloud/scratch/cphillips/clavrx/run_viirs_superres/sites_super_l2/penn_state/2019/07/18/clavrx_VNP02IMG.A2019199.1742.001.2019199230925.uwssec.nc',
                '/ships19/cloud/scratch/cphillips/clavrx/run_viirs_superres/sites_super_l2/penn_state/2019/02/02/clavrx_VNP02IMG.A2019033.1754.001.2019034011318.uwssec.nc']

keep_out = keep_out_opd

tomrink's avatar
tomrink committed

tomrink's avatar
tomrink committed
# target_param = 'cloud_probability'
target_param = 'cld_opd_dcomp'
tomrink's avatar
tomrink committed

group_name_i = 'super/'
group_name_m = 'orig/'

solzen_name = group_name_m + 'solar_zenith'

tomrink's avatar
tomrink committed
params_i = [group_name_i+'temp_11_0um', group_name_i+'refl_0_65um', group_name_i+target_param]
params_m = [group_name_m+'temp_11_0um', group_name_m+'refl_0_65um', group_name_m+target_param]
tomrink's avatar
tomrink committed

param_idx_m = params_m.index(group_name_m + target_param)
param_idx_i = params_i.index(group_name_i + target_param)
tomrink's avatar
tomrink committed


tomrink's avatar
tomrink committed
def is_missing(p_idx, tile):
    keep = np.invert(np.isnan(tile[p_idx, ]))
    if np.sum(keep) / keep.size < 0.98:
        return True


def keep_tile(p_idx, tile):
    grd_k = tile[p_idx, ].copy()
tomrink's avatar
tomrink committed

    if target_param == 'cloud_probability':
tomrink's avatar
tomrink committed
        grd_k = process_cld_prob(grd_k)
tomrink's avatar
tomrink committed
    elif target_param == 'cld_opd_dcomp':
tomrink's avatar
tomrink committed
        grd_k = process_cld_opd(grd_k)
tomrink's avatar
tomrink committed

    if grd_k is not None:
tomrink's avatar
tomrink committed
        tile[p_idx, ] = grd_k
        return tile
tomrink's avatar
tomrink committed
    else:
tomrink's avatar
tomrink committed
        return None
tomrink's avatar
tomrink committed


tomrink's avatar
tomrink committed
def process_cld_prob(grd_k):
tomrink's avatar
tomrink committed
    keep = np.invert(np.isnan(grd_k))
    num_keep = np.sum(keep)
tomrink's avatar
tomrink committed
    keep_clr = np.where(keep, grd_k < 0.30, False)
    keep_cld = np.where(keep, grd_k > 0.70, False)
tomrink's avatar
tomrink committed
    frac_clr = np.sum(keep_clr)/num_keep
    frac_cld = np.sum(keep_cld)/num_keep
tomrink's avatar
tomrink committed
    if not (frac_clr >= 0.20 and frac_cld >= 0.20):
tomrink's avatar
tomrink committed
        return None
    grd_k = np.where(np.invert(keep), 0, grd_k)  # Convert NaN to 0
    return grd_k
tomrink's avatar
tomrink committed


tomrink's avatar
tomrink committed
def process_cld_opd(grd_k):
tomrink's avatar
tomrink committed
    keep = np.invert(np.isnan(grd_k))
    num_keep = np.sum(keep)
tomrink's avatar
tomrink committed
    keep_cld = np.where(keep, np.logical_and(0.1 < grd_k, grd_k < 158.0), False)
    # keep_cld = np.where(keep, (0.1 < grd_k), False)
tomrink's avatar
tomrink committed
    frac_cld = np.sum(keep_cld)/num_keep
tomrink's avatar
tomrink committed
    # if not (0.50 < frac_cld < 0.85):
tomrink's avatar
tomrink committed
    if not (0.25 < frac_cld < 1.0):
tomrink's avatar
tomrink committed
        return None
tomrink's avatar
tomrink committed
    grd_k = np.where(np.invert(keep), 0, grd_k)  # Convert NaN to 0
tomrink's avatar
tomrink committed
    return grd_k
tomrink's avatar
tomrink committed


tomrink's avatar
tomrink committed
def run_all(directory, out_directory, day_night='ANY', pattern='clavrx_*.nc', start=10):
tomrink's avatar
tomrink committed
    cnt = start
    total_num_train_samples = 0
    total_num_valid_samples = 0
tomrink's avatar
tomrink committed
    num_keep_x_tiles = 14
tomrink's avatar
tomrink committed

    path = directory + '**' + '/' + pattern

tomrink's avatar
tomrink committed
    all_files = glob.glob(path, recursive=True)
    data_files = [f for f in all_files if f not in keep_out]
tomrink's avatar
tomrink committed

tomrink's avatar
tomrink committed
    valid_tiles_i = []
    train_tiles_i = []
    valid_tiles_m = []
    train_tiles_m = []
tomrink's avatar
tomrink committed
    f_cnt = 0

    num_files = len(data_files)
    print('Start, number of files: ', num_files)

tomrink's avatar
tomrink committed
    total_num_not_missing = 0

tomrink's avatar
tomrink committed
    hist_accum_valid_i = np.zeros(20, dtype=np.int64)
    hist_accum_valid_m = np.zeros(20, dtype=np.int64)
    hist_accum_train_i = np.zeros(20, dtype=np.int64)
    hist_accum_train_m = np.zeros(20, dtype=np.int64)

tomrink's avatar
tomrink committed
    for idx, data_f in enumerate(data_files):
        # if idx % 4 == 0:  # if we want to skip some files
        if True:
            try:
                h5f = h5py.File(data_f, 'r')
            except:
                print('cant open file: ', data_f)
                continue

            try:
tomrink's avatar
tomrink committed
                num_not_missing = run(h5f, params_m, train_tiles_m, valid_tiles_m,
                                      params_i, train_tiles_i, valid_tiles_i,
tomrink's avatar
tomrink committed
                                      num_keep_x_tiles=num_keep_x_tiles, tile_width=64, kernel_size=7, factor=2, day_night=day_night)
tomrink's avatar
tomrink committed
            except Exception as e:
                print(e)
                h5f.close()
                continue
tomrink's avatar
tomrink committed
            print(data_f)
tomrink's avatar
tomrink committed
            f_cnt += 1
tomrink's avatar
tomrink committed
            h5f.close()

tomrink's avatar
tomrink committed
            total_num_not_missing += num_not_missing

tomrink's avatar
tomrink committed
            if len(train_tiles_m) == 0 and len(valid_tiles_m) == 0:
tomrink's avatar
tomrink committed
                continue

tomrink's avatar
tomrink committed
            if (f_cnt % 20) == 0:
tomrink's avatar
tomrink committed
                num_valid_samples = 0
tomrink's avatar
tomrink committed
                if len(valid_tiles_m) > 0:
                    valid_i = np.stack(valid_tiles_i)
                    valid_m = np.stack(valid_tiles_m)
                    np.save(out_directory + 'valid_mres_' + str(cnt), valid_m)
                    np.save(out_directory + 'valid_ires_' + str(cnt), valid_i)
                    num_valid_samples = valid_m.shape[0]
tomrink's avatar
tomrink committed

tomrink's avatar
tomrink committed
                    h, b = np.histogram(valid_i.flatten(), bins=20, range=[0.0, 160.0])
                    hist_accum_valid_i += h
tomrink's avatar
tomrink committed

tomrink's avatar
tomrink committed
                    h, b = np.histogram(valid_m.flatten(), bins=20, range=[0.0, 160.0])
                    hist_accum_valid_m += h

tomrink's avatar
tomrink committed
                num_train_samples = 0
tomrink's avatar
tomrink committed
                if len(train_tiles_m) > 0:
                    train_i = np.stack(train_tiles_i)
                    train_m = np.stack(train_tiles_m)
                    np.save(out_directory + 'train_ires_' + str(cnt), train_i)
tomrink's avatar
tomrink committed
                    np.save(out_directory + 'train_mres_' + str(cnt), train_m)
tomrink's avatar
tomrink committed
                    num_train_samples = train_m.shape[0]

tomrink's avatar
tomrink committed
                    h, b = np.histogram(train_i.flatten(), bins=20, range=[0.0, 160.0])
                    hist_accum_train_i += h
tomrink's avatar
tomrink committed

tomrink's avatar
tomrink committed
                    h, b = np.histogram(train_m.flatten(), bins=20, range=[0.0, 160.0])
                    hist_accum_train_m += h

tomrink's avatar
tomrink committed
                valid_tiles_i = []
                train_tiles_i = []
                valid_tiles_m = []
                train_tiles_m = []
tomrink's avatar
tomrink committed

                print('  num_train_samples, num_valid_samples, progress % : ', num_train_samples, num_valid_samples, int((f_cnt/num_files)*100))
                total_num_train_samples += num_train_samples
                total_num_valid_samples += num_valid_samples
tomrink's avatar
tomrink committed
                print('total_num_train_samples, total_num_valid_samples, total_num_not_missing: ', total_num_train_samples,
                      total_num_valid_samples, total_num_not_missing)
tomrink's avatar
tomrink committed
                print('--------------------------------------------------')

                cnt += 1

tomrink's avatar
tomrink committed
    # Write out leftover, if any. Maybe make this better someday
    num_valid_samples = 0
    if len(valid_tiles_m) > 0:
        valid_i = np.stack(valid_tiles_i)
        valid_m = np.stack(valid_tiles_m)
        np.save(out_directory + 'valid_mres_' + str(cnt), valid_m)
        np.save(out_directory + 'valid_ires_' + str(cnt), valid_i)
        num_valid_samples = valid_m.shape[0]
tomrink's avatar
tomrink committed

tomrink's avatar
tomrink committed
        h, b = np.histogram(valid_i.flatten(), bins=20, range=[0.0, 160.0])
        hist_accum_valid_i += h
tomrink's avatar
tomrink committed

tomrink's avatar
tomrink committed
        h, b = np.histogram(valid_m.flatten(), bins=20, range=[0.0, 160.0])
        hist_accum_valid_m += h
tomrink's avatar
tomrink committed

    num_train_samples = 0
    if len(train_tiles_m) > 0:
        train_i = np.stack(train_tiles_i)
        train_m = np.stack(train_tiles_m)
        np.save(out_directory + 'train_ires_' + str(cnt), train_i)
tomrink's avatar
tomrink committed
        np.save(out_directory + 'train_mres_' + str(cnt), train_m)
tomrink's avatar
tomrink committed
        num_train_samples = train_m.shape[0]
tomrink's avatar
tomrink committed

tomrink's avatar
tomrink committed
        h, b = np.histogram(train_i.flatten(), bins=20, range=[0.0, 160.0])
        hist_accum_train_i += h
tomrink's avatar
tomrink committed

tomrink's avatar
tomrink committed
        h, b = np.histogram(train_m.flatten(), bins=20, range=[0.0, 160.0])
        hist_accum_train_m += h
tomrink's avatar
tomrink committed

    print('  num_train_samples, num_valid_samples, progress % : ', num_train_samples, num_valid_samples,
          int((f_cnt / num_files) * 100))
    total_num_train_samples += num_train_samples
    total_num_valid_samples += num_valid_samples
    print('total_num_train_samples, total_num_valid_samples, total_num_not_missing: ', total_num_train_samples,
          total_num_valid_samples, total_num_not_missing)
    print('--------------------------------------------------')

tomrink's avatar
tomrink committed
    print('** total_num_train_samples, total_num_valid_samples: ', total_num_train_samples, total_num_valid_samples)
tomrink's avatar
tomrink committed
    print('--------------------------------------------------')
    print(hist_accum_train_i)
tomrink's avatar
tomrink committed
    print('----------')
tomrink's avatar
tomrink committed
    print(hist_accum_train_m)
tomrink's avatar
tomrink committed
    print('----------')
tomrink's avatar
tomrink committed
    print(hist_accum_valid_i)
tomrink's avatar
tomrink committed
    print('----------')
tomrink's avatar
tomrink committed
    print(hist_accum_valid_m)
tomrink's avatar
tomrink committed


#  tile_width: Must be even!
#  kernel_size: Must be odd!
tomrink's avatar
tomrink committed
def run(h5f, params_m, train_tiles_m, valid_tiles_m, params_i, train_tiles_i, valid_tiles_i,
tomrink's avatar
tomrink committed
        num_keep_x_tiles=8, tile_width=64, kernel_size=3, factor=2, day_night='ANY'):
tomrink's avatar
tomrink committed

tomrink's avatar
tomrink committed
    border = int((kernel_size - 1)/2) + 1  # Need to add for interpolation with no edge effects
tomrink's avatar
tomrink committed

tomrink's avatar
tomrink committed
    param_name = params_m[0]
tomrink's avatar
tomrink committed

    num_lines = h5f[param_name].shape[0]
    num_pixels = h5f[param_name].shape[1]  # Must be even

tomrink's avatar
tomrink committed
    if day_night != 'ANY':
tomrink's avatar
tomrink committed
        solzen = get_grid_values(h5f, solzen_name, 0, 0, None, num_lines, num_pixels)

    grd_s = []
tomrink's avatar
tomrink committed
    for param in params_m:
tomrink's avatar
tomrink committed
        try:
tomrink's avatar
tomrink committed
            grd = get_grid_values(h5f, param, 0, 0, None, num_lines, num_pixels)
tomrink's avatar
tomrink committed
            grd_s.append(grd)
        except Exception as e:
            print(e)
            return
tomrink's avatar
tomrink committed
    data_m = np.stack(grd_s)
tomrink's avatar
tomrink committed

    grd_s = []
tomrink's avatar
tomrink committed
    for param in params_i:
tomrink's avatar
tomrink committed
        try:
tomrink's avatar
tomrink committed
            grd = get_grid_values(h5f, param, 0, 0, None, num_lines*factor, num_pixels*factor)
tomrink's avatar
tomrink committed
            grd_s.append(grd)
        except Exception as e:
            print(e)
            return
tomrink's avatar
tomrink committed
    data_i = np.stack(grd_s)
tomrink's avatar
tomrink committed

    tile_width += 2 * border

    i_skip = tile_width
    j_skip = tile_width
tomrink's avatar
tomrink committed
    i_start = int(num_pixels / 2) - int((num_keep_x_tiles * tile_width) / 2)
    j_start = 0
tomrink's avatar
tomrink committed

tomrink's avatar
tomrink committed
    num_y_tiles = int(num_lines / tile_width) - 1
tomrink's avatar
tomrink committed

tomrink's avatar
tomrink committed
    data_tiles_m = []
    data_tiles_i = []
tomrink's avatar
tomrink committed
    num_not_missing = 0
tomrink's avatar
tomrink committed

tomrink's avatar
tomrink committed
    for j in range(num_y_tiles):
tomrink's avatar
tomrink committed
        j_a = j_start + j * j_skip
        j_b = j_a + tile_width

        for i in range(num_keep_x_tiles):
            i_a = i_start + i * i_skip
            i_b = i_a + tile_width

            if day_night == 'DAY' and not is_day(solzen[j_a:j_b, i_a:i_b]):
                continue
            elif day_night == 'NIGHT' and is_day(solzen[j_a:j_b, i_a:i_b]):
                continue

tomrink's avatar
tomrink committed
            nda_m = data_m[:, j_a:j_b, i_a:i_b]
tomrink's avatar
tomrink committed
            nda_i = data_i[:, j_a*factor:j_b*factor, i_a*factor:i_b*factor]
tomrink's avatar
tomrink committed
            if is_missing(param_idx_i, nda_i):
tomrink's avatar
tomrink committed
                continue
            num_not_missing += 1
tomrink's avatar
tomrink committed

tomrink's avatar
tomrink committed
            nda_i = keep_tile(param_idx_i, nda_i)
            if nda_i is not None:
                data_tiles_m.append(nda_m)
                data_tiles_i.append(nda_i)
tomrink's avatar
tomrink committed

tomrink's avatar
tomrink committed
    num_tiles = len(data_tiles_i)
tomrink's avatar
tomrink committed
    num_valid = int(num_tiles * 0.10)
    num_train = num_tiles - num_valid
tomrink's avatar
tomrink committed

tomrink's avatar
tomrink committed
    for k in range(num_train):
tomrink's avatar
tomrink committed
        train_tiles_m.append(data_tiles_m[k])
        train_tiles_i.append(data_tiles_i[k])

tomrink's avatar
tomrink committed
    for k in range(num_valid):
tomrink's avatar
tomrink committed
        valid_tiles_m.append(data_tiles_m[num_train + k])
        valid_tiles_i.append(data_tiles_i[num_train + k])
tomrink's avatar
tomrink committed

tomrink's avatar
tomrink committed
    return num_not_missing