Skip to content
Snippets Groups Projects
Select Git revision
  • 0afb28d747f7c7fdbe647ab8c2bd452c08b06ebe
  • main default protected
  • jonathan-mem-exploration
  • mahir-intern-branch
  • night
  • clean-thr-arrays
  • work_for_AMS
  • 0.3.14
  • 0.3.13
  • 0.3.12
  • 0.3.11
  • 0.3.10
  • 0.3.9
  • 0.3.7
  • 0.3.6
  • 0.3.5
  • 0.3.4
  • 0.3.3
  • 0.3.2
  • 0.3.1
  • 0.3.0
  • 0.2.18
  • 0.2.17
  • 0.2.16
  • 0.2.15
  • 0.2.14
  • 0.2.13
27 results

setup.py

Blame
  • aeolus.py 10.85 KiB
    
    import numpy as np
    # from cartopy import *
    from metpy import *
    
    import h5py
    
    from aeolus.aeolus_amv import get_aeolus_time_dict
    from aeolus.datasource import CLAVRx
    from util.lon_lat_grid import earth_to_indexs
    from util.geos_nav import get_navigation
    from util.util import bin_data_by, get_bin_ranges
    
    # H08 range we'll use for now
    H08_lon_range = [64, 216]  # 0, 360
    H08_lat_range = [-70, 70]
    
    G16_lon_range = [-130.0, -30.0]
    G16_lat_range = [-64.0, 64.0]
    
    bin_ranges = []
    bin_ranges.append([300.0, 2000.0])
    bin_ranges.append([2000.0, 8000.0])
    bin_ranges.append([8000.0, 20000.0])
    
    lat_ranges = get_bin_ranges(-70, 70, 10)
    
    half_width = 30
    num_elems = 5424
    num_lines = 5424
    
    
    def compare_aeolus_max_height(aeolus_dict, files_path, grid_value_name='cld_height_acha', one_cld_layer_only=False, highest_layer=False):
        nav = get_navigation(satellite='GOES16', domain='FD')
        clvrx_files = CLAVRx(files_path)
        num_files = len(clvrx_files.flist)
    
        keys = list(aeolus_dict.keys())
        num_profs = len(keys)
    
        a_lons = [[] for i in range(num_files)]
        a_lats = [[] for i in range(num_files)]
        a_hgts = [[] for i in range(num_files)]
        a_profs = [[] for i in range(num_files)]
        a_times = [[] for i in range(num_files)]
    
        for key in keys:
            _, _, f_idx = clvrx_files.get_file_containing_time(key)
            if f_idx is None:
                continue
            layers = aeolus_dict.get(key)
            if layers is None:
                continue
    
            lat = layers[0, 0]
            lon = layers[0, 1]
    
            a_lons[f_idx].append(lon)
            a_lats[f_idx].append(lat)
            a_times[f_idx].append(key)
            a_profs[f_idx].append(layers)
    
        for f_idx in range(num_files):
            a_lons[f_idx] = np.array(a_lons[f_idx])
            a_lats[f_idx] = np.array(a_lats[f_idx])
            a_hgts[f_idx] = np.array(a_hgts[f_idx])
            a_times[f_idx] = np.array(a_times[f_idx])
    
        grd_hgt = []
        grd_mean = []
        grd_std = []
        hits = []
        num_layers = []
        lon = []
        lat = []
        layer_thickness = []
        hgt_diff = []
        hgt_top_max_diff_s = []
        layer_bot = []
        layer_top = []
        times = []
    
        # Loop over all Datasets
        vld_grd = 0
        num_hits = 0
        total = 0
    
        for f_idx, file in enumerate(clvrx_files.flist):
            try:
                h5f = h5py.File(file, 'r')
            except Exception:
                h5f.close()
                print('Problem with file: ', file)
                continue
    
            try:
                grd_vals = get_grid_values(h5f, grid_value_name)
            except Exception:
                print('can\'t read grid')
                h5f.close()
                continue
    
            nn_idxs = nav.earth_to_indexs(a_lons[f_idx], a_lats[f_idx], grd_vals.shape[0])
            if len(nn_idxs) == 0:
                continue
    
            on_earth = nn_idxs != -1
            nn_idxs = nn_idxs[on_earth]
            grd_crds = np.unravel_index(nn_idxs, grd_vals.shape)
            a_lons[f_idx] = a_lons[f_idx][on_earth]
            a_lats[f_idx] = a_lats[f_idx][on_earth]
            a_times[f_idx] = a_times[f_idx][on_earth]
    
            layers = []
            for k in range(len(on_earth)):
                if on_earth[k]:
                    layers.append(a_profs[f_idx][k])
            a_profs[f_idx] = layers
    
            total += len(nn_idxs)
            print(clvrx_files.flist[f_idx], len(nn_idxs))
    
            # loop over Aeolus profile valid in the file
            for k in range(len(nn_idxs)):
                j = grd_crds[0][k]
                i = grd_crds[1][k]
    
                grd_cntr_val = grd_vals[j, i]
                grd_vals_3x3 = grd_vals[j-1:j+2, i-1:i+2]
                grd_vals_3x3 = grd_vals_3x3.flatten()
                # if np.sum(np.isnan(grd_vals_3x3)) > 4:
                #     continue
                keep = np.invert(np.isnan(grd_vals_3x3))
                grd_3x3_mean = np.mean(grd_vals_3x3[keep])
                grd_3x3_std = np.std(grd_vals_3x3[keep])
                # grd_max = np.max(grd_vals_3x3[keep])
    
                # bt_vals_5x5 = bt_vals[j-2:j+3, i-2:i+3]
                # bt_vals_5x5 = bt_vals_5x5.flatten()
                # keep = np.invert(np.isnan(bt_vals_5x5))
                # bt_5x5_mean = np.mean(bt_vals_5x5[keep])
                # bt_5x5_std = np.std(bt_vals_5x5[keep])
    
                grd_vals_1x1 = grd_vals[j, i]
                grd_vals_1x1 = grd_vals_1x1.flatten()
                if (np.isnan(grd_vals_1x1[0])):
                    continue
    
                prof = a_profs[f_idx][k]
                max_idx = np.argmax(prof[:, 2])
                hht_max = prof[max_idx, 2]
                nlayers = prof.shape[0]
    
                lyr_idxs = [*range(nlayers)]
                if highest_layer:
                    lyr_idxs = [max_idx]
    
                if one_cld_layer_only and nlayers > 1:
                    continue
    
                vld_grd += 1
                hit = False
                lyr_width = None
                hgt_top_diff = None
                hgt_top_max_diff = None
                tops = []
                bots = []
    
                for j in lyr_idxs:
                    hhb = prof[j, 3]
                    hht = prof[j, 2]
                    bots.append(hhb)
                    tops.append(hht)
    
                    lyr_width = hht - hhb
    
                    hhb -= 100
                    hht += 100
    
                    cnt = 0
                    for i in range(len(grd_vals_1x1)):
                        ghgt = grd_vals_1x1[i]
                        if np.isnan(ghgt):
                            continue
    
                        hgt_top_diff = ghgt - hht
                        hgt_top_max_diff = ghgt - hht_max
    
                        if ghgt >= hhb and ghgt <= hht:
                            cnt += 1
    
                    if cnt > 0:
                        hit = True
                        num_hits += 1
                        break
    
                hits.append(hit)
                grd_hgt.append(grd_vals_1x1)
                grd_mean.append(grd_3x3_mean)
                grd_std.append(grd_3x3_std)
    
                lon.append(a_lons[f_idx][k])
                lat.append(a_lats[f_idx][k])
                times.append(a_times[f_idx][k])
    
                layer_thickness.append(lyr_width)
                hgt_diff.append(hgt_top_diff)
                hgt_top_max_diff_s.append(hgt_top_max_diff)
    
                num_layers.append(nlayers)
                layer_bot.append(bots)
                layer_top.append(tops)
    
            h5f.close()
            print(f_idx, num_files)
    
        print('num aeolus profiles: ', num_profs)
        print('Overall: ', num_hits, vld_grd, total)
        print('*')
        hits = np.array(hits)
        grd_hgt = np.array(grd_hgt)
        grd_mean = np.array(grd_mean)
        grd_std = np.array(grd_std)
        num_layers = np.array(num_layers)
        lon = np.array(lon)
        lat = np.array(lat)
        hgt_diff = np.array(hgt_diff)
        hgt_top_max_diff_s = np.array(hgt_top_max_diff_s)
        layer_thickness = np.array(layer_thickness)
        layer_bot = np.array(layer_bot)
        layer_top = np.array(layer_top)
        times = np.array(times)
    
        print('AEOLUS num layers: ')
        print(np.average(num_layers), np.std(num_layers))
        print('--------------------')
    
        print('Grid cntr height: ')
        print(np.average(grd_hgt[hits]))
        print(np.average(grd_hgt[np.invert(hits)]))
        print('--------------------')
    
        print('3x3 mean: ')
        print(np.average(grd_mean[hits]))
        print(np.average(grd_mean[np.invert(hits)]))
        print('--------------------')
    
        print('3x3 std: ')
        print(np.average(grd_std[hits]))
        print(np.average(grd_std[np.invert(hits)]))
        print('--------------------')
    
        print('layer thickness: ')
        print(np.average(layer_thickness[hits]))
        print(np.average(layer_thickness[np.invert(hits)]))
        print('---------------------')
    
        print('CLAVR - AEOLUS TOP: ')
        print(np.average(hgt_diff[hits]), np.std(hgt_diff[hits]))
        print(np.average(hgt_top_max_diff_s[np.invert(hits)]))
        print('---------------------')
    
        print('CLVR grid cntr height histo: ')
        print(np.histogram(grd_hgt, bins=8))
        print('----------------------')
    
        bdat = bin_data_by(hgt_top_max_diff_s, grd_hgt[:, 0], bin_ranges=bin_ranges)
        print('CLAVR - (HIGHEST AEOLUS CLD LYR TOP: ')
        print('All: ')
        print(np.average(hgt_top_max_diff_s), np.std(hgt_top_max_diff_s))
        print('Low: ')
        print(np.average(bdat[0]), np.std(bdat[0]))
        print('Mid: ')
        print(np.average(bdat[1]), np.std(bdat[1]))
        print('High: ')
        print(np.average(bdat[2]), np.std(bdat[2]))
        print('------------------------')
    
        # bdat = bin_data_by(hgt_top_max_diff_s, lat[:, 0], bin_ranges=lat_ranges)
        # lat_cntrs = []
        # avg_dz = []
        # std_dz = []
        # for i in range(len(lat_ranges)):
        #     lat_cntrs.append((lat_ranges[i][0] + lat_ranges[i][1])/2)
        #     avg_dz.append(np.average(bdat[i]))
        #     std_dz.append(np.std(bdat[i]))
    
        return layer_bot, layer_top, grd_hgt, lat, lon, times
    
    
    def get_grid_values(h5f, grid_name, scale_factor_name='scale_factor', add_offset_name='add_offset'):
        hfds = h5f[grid_name]
        attrs = hfds.attrs
    
        grd_vals = hfds[:, :]
        grd_vals = np.where(grd_vals == -999, np.nan, grd_vals)
        grd_vals = np.where(grd_vals == -127, np.nan, grd_vals)
        grd_vals = np.where(grd_vals == -32768, np.nan, grd_vals)
    
        if attrs is None:
            return grd_vals
    
        if scale_factor_name is not None:
            scale_factor = attrs.get(scale_factor_name)[0]
            grd_vals = grd_vals * scale_factor
    
        if add_offset_name is not None:
            add_offset = attrs.get(add_offset_name)[0]
            grd_vals = grd_vals + add_offset
    
        return grd_vals
    
    
    def analyze_aelolus_cld_layers(cld_layer_dct):
        keys = list(cld_layer_dct.keys())
    
        num_single_layer = 0
        num_multi_layer = 0
        num_cld_layers = 0
    
        lats = []
        lons = []
        lats_sl = []
        lons_sl = []
    
        cld_tops = []
        cld_thickness = []
        cld_cntr = []
        num_layers = []
        max_top = []
    
        for key in keys:
            layers = cld_layer_dct[key]
    
            lat = layers[0, 0]
            lon = layers[0, 1]
    
            n_lyrs = layers.shape[0]
            if n_lyrs > 1:
                num_multi_layer += 1
            else:
                num_single_layer += 1
            num_cld_layers += 1
    
            num_layers.append(n_lyrs)
    
            idx_max = np.argmax(layers[:, 2])
            max_top.append(layers[idx_max, 2])
            lats_sl.append(lat)
            lons_sl.append(lon)
    
            for k in range(n_lyrs):
                # hhh = layers[k, 2]
                hht = layers[k, 2]
                hhb = layers[k, 3]
                cld_tops.append(hht)
                cld_thickness.append(hht - hhb)
                cld_cntr.append((hht - hhb)/2)
    
                lats.append(lat)
                lons.append(lon)
    
        lats = np.array(lats)
        lons = np.array(lons)
        cld_tops = np.array(cld_tops)
        cld_thickness = np.array(cld_thickness)
        cld_cntr = np.array(cld_cntr)
        max_top = np.array(max_top)
        lats_sl = np.array(lats_sl)
        lons_sl = np.array(lons_sl)
    
        print(num_cld_layers, num_single_layer, num_multi_layer)
    
        mt_by_lat = bin_data_by(max_top, lats_sl, lat_ranges)
    
        lat_cntrs = []
        avg_maxz = []
        std_maxz = []
        for i in range(len(lat_ranges)):
            lat_cntrs.append((lat_ranges[i][0] + lat_ranges[i][1])/2)
            avg_maxz.append(np.average(mt_by_lat[i]))
            std_maxz.append(np.std(mt_by_lat[i]))
    
        return cld_thickness, max_top, avg_maxz, std_maxz, lat_cntrs