diff --git a/modules/aeolus/aeolus_amv.py b/modules/aeolus/aeolus_amv.py index 1c01354f4e12fab5884da7f25743c1bfa61395ef..b44f163cd2397a74384a4a92920393d5cf0696bf 100644 --- a/modules/aeolus/aeolus_amv.py +++ b/modules/aeolus/aeolus_amv.py @@ -1137,6 +1137,14 @@ def compare_amvs_bestfit(amvs, bfs, bin_size=200): # Comparison to Level of Best Fit (LBF) ------------------------------------------------------------------ # -------------------------------------------------------------------------------------------------------- bin_ranges = get_press_bin_ranges(100, 1000, bin_size=bin_size) + bin_ranges = [] + bin_ranges.append([50, 300]) + bin_ranges.append([300, 400]) + bin_ranges.append([400, 500]) + bin_ranges.append([500, 600]) + bin_ranges.append([600, 700]) + bin_ranges.append([700, 800]) + bin_ranges.append([800, 1000]) vld_bf = bfs[:, 3] == 0 keep_idxs = vld_bf @@ -1261,14 +1269,14 @@ def make_plot(bin_ranges, bin_values): bias.append(np.average(bin_vals[i])) std.append(np.std(bin_vals[i])) - title='ACHA - RAOB Pres Match' - x_axis_label = 'STD (m/s)' + title='ACHA - RAOB BestFit' + x_axis_label = 'STD (deg)' do_plot(x_values, [std_r, std_g, std], ['ICE', 'NOT ICE', 'ALL'], ['blue', 'red', 'black'], title=title, x_axis_label=x_axis_label, y_axis_label='hPa', invert=True, flip=True) - x_axis_label = 'BIAS (m/s)' + x_axis_label = 'BIAS (deg)' do_plot(x_values, [bias_r, bias_g, bias], ['ICE', 'NOT ICE', 'ALL'], ['blue', 'red', 'black'], title=title, x_axis_label=x_axis_label, y_axis_label='hPa', invert=True, flip=True) - x_axis_label = 'MAD (m/s)' + x_axis_label = 'MAD (deg)' do_plot(x_values, [mad_r, mad_g, mad], ['ICE', 'NOT ICE', 'ALL'], ['blue', 'red', 'black'], title=title, x_axis_label=x_axis_label, y_axis_label='hPa', invert=True, flip=True) do_plot(x_values, [num_vals_r, num_vals_g, num_vals], ['ICE: '+str(num_r), 'NOT ICE: '+str(num_g), 'ALL: '+str(num)], ['blue', 'red', 'black'], title=title, x_axis_label='log(Count)', y_axis_label='hPa', invert=True, flip=True) diff --git a/modules/aeolus/datasource.py b/modules/aeolus/datasource.py index b395682ab3659dc8d2630d0048529065f6755cde..678f87bb3f183ae3ae9bf0db0d4be37492091e6f 100644 --- a/modules/aeolus/datasource.py +++ b/modules/aeolus/datasource.py @@ -7,6 +7,54 @@ from aeolus.geos_nav import GEOSNavigation from util.util import GenericException +class Files: + def __init__(self, files_path, file_time_span, pattern): + #self.flist = glob.glob(files_path + 'raob_soundings*.nc') + self.flist = glob.glob(files_path + pattern) + if len(self.flist) == 0: + raise GenericException('no matching files found in: ' + files_path) + + self.ftimes = [] + self.span_seconds = datetime.timedelta(minutes=file_time_span).seconds + + for pname in self.flist: + dto = self.get_datetime(pname) + dto_start = dto + dto_end = dto + datetime.timedelta(minutes=file_time_span) + self.ftimes.append((dto_start.timestamp(), dto_end.timestamp())) + + self.ftimes = np.array(self.ftimes) + self.flist = np.array(self.flist) + sidxs = np.argsort(self.ftimes[:, 0]) + self.ftimes = self.ftimes[sidxs, :] + self.flist = self.flist[sidxs] + + def get_datetime(self, pathname): + filename = os.path.split(pathname)[1] + dt_str = (((filename.split('raob_soundings'))[1]).split('.'))[0] + dto = datetime.datetime.strptime(dt_str, '%Y%m%d_%H%M').replace(tzinfo=timezone.utc) + return dto + + def get_file_containing_time(self, timestamp): + k = -1 + for i in range(self.ftimes.shape[0]): + if (timestamp >= self.ftimes[i, 0]) and (timestamp < self.ftimes[i, 1]): + k = i + break + if k < 0: + return None, None, None + + return self.flist[k], self.ftimes[k, 0], k + + def get_file(self, timestamp): + diff = self.ftimes[:, 0] - timestamp + midx = np.argmin(np.abs(diff)) + if np.abs(self.ftimes[midx, 0] - timestamp) < self.span_seconds: + return self.flist[midx], self.ftimes[midx, 0], midx + else: + return None, None, None + + class AMVFiles: def __init__(self, files_path, file_time_span, pattern, band='14', elem_name=None, line_name=None, lat_name=None,