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