diff --git a/preprocess_thresholds.py b/preprocess_thresholds.py index 9d51feffd470b63c389485fd7f57f5f90da8091f..56d12a16a0925cf17fd1f3813f7f5556d7617b46 100644 --- a/preprocess_thresholds.py +++ b/preprocess_thresholds.py @@ -48,7 +48,7 @@ def thresholds_11_12um(data: xr.Dataset, schi = np.array(schi, dtype=np.float32) # this is because the C function expects a float m15 = data.M15.values[scene_idx].ravel() - latitude = data.latitude.values[scene_idx].ravel + latitude = data.latitude.values[scene_idx].ravel() thr = anc.py_cithr(1, schi, m15) thr_dict = prepare_11_12um_thresholds(thresholds, m15.shape[0]) @@ -356,34 +356,56 @@ def polar_night_thresholds(data, thresholds, scene, test_name, scene_idx): return out_thr.T -def get_nl_thresholds(data, threshold): - lo_val = threshold['bt_diff_bounds'][0] - hi_val = threshold['bt_diff_bounds'][1] - lo_val_thr = threshold['nl_11_4m'][0] - hi_val_thr = threshold['nl_11_4m'][1] - conf_range = threshold['nl_11_4m'][2] - power = threshold['nl_11_4m'][3] - - a = (data['M15-M16'].values - lo_val) / (hi_val - lo_val) - midpt = lo_val_thr + a*(hi_val_thr - lo_val_thr) - hicut = midpt - conf_range - locut = midpt + conf_range - - idx = np.nonzero(data['M15-M16'].values > threshold['bt_diff_bounds'][0]) - locut[idx] = threshold['nl_11_4l'][0] - midpt[idx] = threshold['nl_11_4l'][1] - hicut[idx] = threshold['nl_11_4l'][2] - power[idx] = threshold['nl_11_4l'][3] - - idx = np.nonzero(data['M15-M16'].values < threshold['bt_diff_bounds'][1]) - locut[idx] = threshold['nl_11_4h'][0] - midpt[idx] = threshold['nl_11_4h'][1] - hicut[idx] = threshold['nl_11_4h'][2] - power[idx] = threshold['nl_11_4h'][3] - - out_thr = xr.DataArray(data=np.stack((locut, midpt, hicut, np.ones(data.M01.shape), power)), - dims=('number_of_lines', 'number_of_pixels', 'z')) - return out_thr +# get_nl_thresholds +def land_night_thresholds(data, threshold, coast=True): + if coast is False: + lo_val = threshold['bt_diff_bounds'][0] + hi_val = threshold['bt_diff_bounds'][1] + lo_val_thr = threshold['thr_mid'][0] + hi_val_thr = threshold['thr_mid'][1] + conf_range = threshold['thr_mid'][2] + + a = (data['M15-M16'].values - lo_val) / (hi_val - lo_val) + midpt = lo_val_thr + a*(hi_val_thr - lo_val_thr) + hicut = midpt - conf_range + locut = midpt + conf_range + + power = np.full(midpt.shape, threshold['thr_mid'][3]) + + idx = np.nonzero(data['M15-M16'].values > threshold['bt_diff_bounds'][0]) + locut[idx] = threshold['thr_low'][0] + midpt[idx] = threshold['thr_low'][1] + hicut[idx] = threshold['thr_low'][2] + power[idx] = threshold['thr_low'][3] + + idx = np.nonzero(data['M15-M16'].values < threshold['bt_diff_bounds'][1]) + locut[idx] = threshold['thr_hi'][0] + midpt[idx] = threshold['thr_hi'][1] + hicut[idx] = threshold['thr_hi'][2] + power[idx] = threshold['thr_hi'][3] + + out_thr = np.dstack((locut.ravel(), midpt.ravel(), hicut.ravel(), + np.ones(locut.ravel().shape), power.ravel())) + return np.squeeze(out_thr.T) + else: + b0 = threshold['coeffs'][0] + b1 = threshold['coeffs'][1] + b2 = threshold['coeffs'][2] + + thr = b0 + threshold['int_adj'] + b1*data.geos_tpw.values + b2*data.geos_tpw.values**2 + hicut = np.empty((2, thr.shape[0], thr.shape[1])) + midpt = np.empty((2, thr.shape[0], thr.shape[1])) + locut = np.empty((2, thr.shape[0], thr.shape[1])) + hicut[0, :] = thr - 1 + hicut[1, :] = thr + 1 + midpt[0, :] = hicut[0, :] - 0.5 + midpt[1, :] = hicut[1, :] + 0.5 + locut[0, :] = hicut[0, :] - 1 + locut[1, :] = hicut[1, :] + 1 + + out_thr = np.dstack((hicut[0, :], midpt[0, :], locut[0, :], locut[1, :], midpt[1, :], hicut[1, :], + np.ones(locut[0, :].shape), np.ones(locut[0, :].shape))) + return np.moveaxis(out_thr, -1, 0) def vis_refl_thresholds(data, thresholds, scene, scene_idx): @@ -454,21 +476,22 @@ def gemi_thresholds(data, thresholds, scene_name, scene_idx): return gemi_thr.T -def bt_diff_11_4um_thresholds(data, threshold): +def bt_diff_11_4um_thresholds(data, threshold, scene_idx): c = threshold['coeffs'] - tpw = data.geos_tpw.values + tpw = data.geos_tpw.values[scene_idx].ravel() thr = c[0] + threshold['corr'] + c[1]*tpw + c[2]*np.power(tpw, 2) - hicut0 = (thr + threshold['hicut_coeff'][0]).reshape(1, np.prod(tpw.shape)) - hicut1 = (thr + threshold['hicut_coeff'][1]).reshape(1, np.prod(tpw.shape)) - midpt0 = (hicut0 + threshold['midpt_coeff'][0]).reshape(1, np.prod(tpw.shape)) - midpt1 = (hicut1 + threshold['midpt_coeff'][1]).reshape(1, np.prod(tpw.shape)) - locut0 = (hicut0 + threshold['locut_coeff'][0]).reshape(1, np.prod(tpw.shape)) - locut1 = (hicut1 + threshold['locut_coeff'][1]).reshape(1, np.prod(tpw.shape)) - - thr_out = np.vstack([hicut0, midpt0, locut0, locut1, midpt1, hicut1, + + hicut0 = thr + threshold['hicut_coeff'][0] + hicut1 = thr + threshold['hicut_coeff'][1] + midpt0 = hicut0 + threshold['midpt_coeff'][0] + midpt1 = hicut1 + threshold['midpt_coeff'][1] + locut0 = hicut0 + threshold['locut_coeff'][0] + locut1 = hicut1 + threshold['locut_coeff'][1] + + thr_out = np.dstack([locut0, midpt0, hicut0, hicut1, midpt1, locut1, np.ones(hicut0.shape), np.ones(hicut0.shape)]) - return thr_out + return np.squeeze(thr_out.T) def thresholds_1_38um_test(data, thresholds, scene_name, scene_idx): diff --git a/read_data.py b/read_data.py index 96f61b17dbd4075f7064b96f4ca511a72cb85ac3..2a12b609fc58f479b05823c926f9a3d62f97283e 100644 --- a/read_data.py +++ b/read_data.py @@ -194,6 +194,8 @@ def get_data(file_names: Dict[str, str], viirs_data['M16'].values[idx] = _bad_data # Compute channel differences and ratios that are used in the tests + viirs_data['M15-M13'] = (('number_of_lines', 'number_of_pixels'), + viirs_data.M15.values - viirs_data.M13.values) viirs_data['M14-M15'] = (('number_of_lines', 'number_of_pixels'), viirs_data.M14.values - viirs_data.M15.values) viirs_data['M15-M16'] = (('number_of_lines', 'number_of_pixels'), diff --git a/scene.py b/scene.py index c921417bcaafe26da08569b49e6bcbcdf403ed95..0abe8659237ca5ce4ab5a64ddef5254ce09f0c4c 100644 --- a/scene.py +++ b/scene.py @@ -13,10 +13,11 @@ import ancillary_data as anc _scene_list = ['Ocean_Day', 'Ocean_Night', 'Land_Day', 'Land_Night', 'Day_Snow', 'Night_Snow', 'Coast_Day', 'Land_Day_Desert', 'Antarctic_Day', 'Polar_Day_Snow', 'Polar_Day_Desert', 'Polar_Day_Ocean', 'Polar_Day_Desert_Coast', 'Polar_Day_Coast', 'Polar_Day_Land', 'Polar_Night_Snow', - 'Polar_Night_Land', 'Polar_Night_Ocean', 'Land_Day_Desert_Coast', 'Land_Day_Coast', 'Desert'] + 'Polar_Night_Land', 'Polar_Night_Ocean', 'Land_Day_Desert_Coast', 'Land_Day_Coast', 'Desert', + 'Australia'] _flags = ['day', 'night', 'land', 'coast', 'sh_lake', 'sh_ocean', 'water', 'polar', 'sunglint', 'greenland', 'high_elevation', 'antarctica', 'desert', 'visusd', 'vrused', 'map_snow', 'map_ice', - 'ndsi_snow', 'snow', 'ice', 'new_zealand', 'uniform'] + 'ndsi_snow', 'snow', 'ice', 'new_zealand', 'uniform', 'australia'] # temp value, need to verify what the actual bad_data value is in the C code _bad_data = -999.0 @@ -297,6 +298,9 @@ def find_scene(data, sunglint_angle): idx = np.nonzero((day == 0) & (lat > 86.0)) scene_flag['ice'][idx] = 1 + idx = np.nonzero((lat <= -11) & (lat > -40) & (lon <= 155) & (lon > 110)) + scene_flag['australia'][idx] = 1 + # Check regional uniformity # Check for data border pixels scene_flag['uniform'] = anc.py_check_reg_uniformity(eco, eco, snowfr, icefr, lsf)['loc_uniform'] @@ -436,4 +440,7 @@ def scene_id(scene_flag): idx = np.nonzero(scene_flag['desert'] == 1) scene['Desert'][idx] = 1 + idx = np.nonzero(scene_flag['australia'] == 1) + scene['Australia'][idx] = 1 + return scene diff --git a/spectral_tests.py b/spectral_tests.py index d08c6001af6822ac4d8933db8f614a12c80edb8e..183efb591a7d71c685456166ede70c71d430c52d 100644 --- a/spectral_tests.py +++ b/spectral_tests.py @@ -1,7 +1,7 @@ import numpy as np import xarray as xr -# from numpy.lib.stride_tricks import sliding_window_view +from numpy.lib.stride_tricks import sliding_window_view from typing import Dict import functools @@ -43,7 +43,7 @@ class CloudTests(object): @functools.wraps(func) def wrapper(self, *args, test_name, **kwargs): if test_name not in self.thresholds[self.scene_name]: - # print('Not running test for this scene') + print('Not running test for this scene') # returns cmin. This could be changed into a keyworded argument for readability test_bit = np.zeros(args[-1].shape) return args[-1], test_bit @@ -164,7 +164,7 @@ class CloudTests(object): cmin: np.ndarray, test_name: str = '11-12um_Cirrus_Test') -> np.ndarray: - confidence = np.ones(self.data.M01.shape) + confidence = np.ones(self.data.M15.shape) qa_bit = np.zeros(self.data[band].shape) test_bit = np.zeros(self.data[band].shape) threshold = self.thresholds[self.scene_name][test_name] @@ -192,29 +192,147 @@ class CloudTests(object): cmin: np.ndarray, test_name: str = '11-4um_BT_Difference_Test') -> np.ndarray: - confidence = np.ones(self.data.M01.shape) + confidence = np.ones(self.data.M15.shape) qa_bit = np.zeros(self.data[band].shape) test_bit = np.zeros(self.data[band].shape) threshold = self.thresholds[self.scene_name][test_name] if (threshold['perform'] is True and self.pixels_in_scene is True): qa_bit[self.scene_idx] = 1 - thr = preproc.bt_diff_11_4um_thresholds(self.data, threshold) + print(f'Testing "{self.scene_name}"\n') + thr = preproc.bt_diff_11_4um_thresholds(self.data, threshold, self.scene_idx) + rad = self.data[band].values[self.scene_idx] + test_bit[self.scene_idx] = 1 # THIS NEEDS TO BE CALCULATED PROPERLY + confidence[self.scene_idx] = conf.conf_test_dble(rad, thr) + + cmin = np.fmin(cmin, confidence) + + return cmin, test_bit + + @run_if_test_exists_for_scene + def bt_difference_11_4um_test_land(self, + band1: str, + band2: str, + cmin: np.ndarray, + test_name: str = '11-4um_BT_Difference_Test') -> np.ndarray: + + confidence = np.ones(self.data.M15.shape) + qa_bit = np.zeros(self.data[band1].shape) + test_bit = np.zeros(self.data[band1].shape) + threshold = self.thresholds[self.scene_name][test_name] - # CONTINUE FROM HERE... + scene_flag = scn.find_scene(self.data, self.thresholds['Sun_Glint']['bounds'][3]) + if (threshold['perform'] is True and self.pixels_in_scene is True): + qa_bit[self.scene_idx] = 1 + print(f'Testing "{self.scene_name}"\n') + if self.scene_name == 'Land_Night': + australia = self.data.Australia.values + ndvi = self.data.ndvi.values + coast = scene_flag['coast'] + sh_lake = scene_flag['sh_lake'] + idx = np.where(((australia == 0) & (ndvi < threshold['ndvi']) & (coast == 0)) | + ((australia == 1) & (ndvi < threshold['ndvi_australia']) & (coast == 0))) + not_idx = np.ones(australia.shape, dtype=bool) + not_idx[idx] = False + + rad11_12 = self.data[band1].values + rad11_4 = self.data[band2].values + thr = preproc.get_nl_thresholds(self.data, threshold, coast=False) + idx_lake = np.where((sh_lake == 1) | (rad11_12 < 0)) + # test_bit[self.scene_idx] = 1 # THIS NEEDS TO BE CALCULATED PROPERLY + thr[:3, idx_lake] = thr[:3, idx_lake] + 2 + temp_thr = np.squeeze(thr[:, idx[0]]) + temp_rad = rad11_4[idx] + confidence[idx] = conf.conf_test_new(temp_rad, temp_thr) + + thr = preproc.land_night_thresholds(self.data, threshold, coast=True) + temp_thr = np.squeeze(thr[:, not_idx]) + temp_rad = rad11_4[not_idx] + thr[0:3, idx_lake[0], idx_lake[1]] = thr[0:3, idx_lake[0], idx_lake[1]] - 1 + thr[3:6, idx_lake[0], idx_lake[1]] = thr[3:6, idx_lake[0], idx_lake[1]] + 1 + + confidence[not_idx] = conf.conf_test_dble(rad11_4[not_idx], thr[:, not_idx]) + + if self.scene_name in ['Polar_Night_Land', 'Polar_Day_Snow', 'Day_Snow']: + rad11_12 = self.data[band1].values[self.scene_idx] + rad11_4 = self.data[band2].values[self.scene_idx] + thr = preproc.polar_night_thresholds(self.data, threshold, self.scene_name, + test_name, self.scene_idx) + confidence[self.scene_idx] = conf.conf_test_new(rad11_4, thr) + + if self.scene_name in ['Polar_Night_Snow']: + rad11_12 = self.data[band1].values + rad11_4 = self.data[band2].values + idx_top = np.nonzero(self.data.M15.values > threshold['bt_thr']) + thr_top = preproc.polar_night_thresholds(self.data, threshold['top'], self.scene_name, + test_name, idx_top) + idx_bottom = np.nonzero((self.data.M15.values > threshold['bt_thr']) & + (self.data.geos_tpw > threshold['tpw_thr'])) + thr_bottom = preproc.polar_night_thresholds(self.data, threshold['bottom'], self.scene_name, + test_name, idx_top) + + confidence[idx_top] = conf.conf_test_new(rad11_4[idx_top], thr_top) + confidence[idx_bottom] = conf.conf_test_new(rad11_4[idx_bottom], thr_bottom) + + if self.scene_name in ['Night_Snow']: + rad11_12 = self.data[band1].values + rad11_4 = self.data[band2].values + idx_top = np.nonzero(self.data.M15.values > threshold['bt_thr']) + thr_top = threshold['thr'] + idx_bottom = np.nonzero((self.data.M15.values > threshold['bt_thr']) & + (self.data.geos_tpw > threshold['tpw_thr'])) + thr_bottom = preproc.polar_night_thresholds(self.data, threshold['bottom'], self.scene_name, + test_name, idx_top) + + confidence[idx_top] = conf.conf_test_new(rad11_4[idx_top], thr_top) + confidence[idx_bottom] = conf.conf_test_new(rad11_4[idx_bottom], thr_bottom) + + cmin = np.fmin(cmin, confidence) + return cmin, test_bit + + # This test requires 7.3um band that is not available for VIIRS @run_if_test_exists_for_scene def midlevel_cloud_test(): pass + # This test requires 7.3um band that is not available for VIIRS @run_if_test_exists_for_scene def water_vapor_cloud_test(): pass @run_if_test_exists_for_scene - def variability_11um_test(): - pass + def variability_11um_test(self, + band: str, + cmin: np.ndarray, + test_name: str = '11um_Variability_Test') -> np.ndarray: + + confidence = np.ones(self.data.M15.shape) + qa_bit = np.zeros(self.data[band].shape) + test_bit = np.zeros(self.data[band].shape) + threshold = self.thresholds[self.scene_name][test_name] + var = np.zeros([self.data.M15.shape[0], self.data.M15.shape[1], 9]) + radshape = self.data.M15.shape + + if (threshold['perform'] is True and self.pixels_in_scene is True): + qa_bit[self.scene_idx] = 1 + print(f'Testing "{self.scene_name}"\n') + rad = self.data[band].values + + test = (sliding_window_view(np.pad(rad, [1, 1], mode='constant'), (3, 3)) - + np.expand_dims(rad, (2, 3))) + var[np.abs(test).reshape(radshape[0], radshape[1], 9) < threshold['variability']] = 1 + var = var.sum(axis=2) + + idx = np.where(var == 9) + test_bit[idx] = 1 + thr = np.array(threshold['thr']) + confidence[idx] = conf.conf_test_new(rad[idx], thr) + + cmin = np.fmin(cmin, confidence) + + return cmin, test_bit @run_if_test_exists_for_scene def oceanic_stratus_11_4um_test(self, @@ -222,7 +340,7 @@ class CloudTests(object): cmin: np.ndarray, test_name: str = '11-4um_Oceanic_Stratus_Test') -> np.ndarray: - confidence = np.ones(self.data.M01.shape) + confidence = np.ones(self.data.M15.shape) qa_bit = np.zeros(self.data[band].shape) test_bit = np.zeros(self.data[band].shape) threshold = self.thresholds[self.scene_name][test_name] @@ -237,9 +355,9 @@ class CloudTests(object): confidence[self.scene_idx] = conf.conf_test_dble(rad, thr) # these scenes have not been implemented yet - elif self.scene_name in ['Land_Night', 'Polar_Night_Land', 'Polar_Day_Snow', 'Polar_Night_Snow', - 'Day_Snow', 'Night_Snow', 'Antarctic_Day']: - pass + # elif self.scene_name in ['Land_Night', 'Polar_Night_Land', 'Polar_Day_Snow', 'Polar_Night_Snow', + # 'Day_Snow', 'Night_Snow', 'Antarctic_Day']: + # pass else: scene_flag = scn.find_scene(self.data, self.thresholds['Sun_Glint']['bounds'][3]) idx = np.nonzero((self.data[band].values >= threshold['thr'][1]) & @@ -252,7 +370,7 @@ class CloudTests(object): cmin = np.fmin(cmin, confidence) - return cmin, test_bit # np.abs(1-test_bit)*qa_bit + return cmin, test_bit @run_if_test_exists_for_scene def nir_reflectance_test(self, diff --git a/thresholds.mvcm.snpp.v0.0.1.yaml b/thresholds.mvcm.snpp.v0.0.1.yaml index e8f59044f4b192e4f94bf6320701eb16aebe1ad2..801c795c7c763f2ac975b601d9c636892b8099a8 100644 --- a/thresholds.mvcm.snpp.v0.0.1.yaml +++ b/thresholds.mvcm.snpp.v0.0.1.yaml @@ -13,8 +13,6 @@ Land_Day: 11-4um_Oceanic_Stratus_Test: thr: [-16.0, -14.0, -12.0, 1.0, 1.0] perform: True - CO2_High_Clouds_Test: [222.0, 224.0, 226.0, 1.0, 1.0] - Water_Vapor_High_Clouds_Test: [215.0, 220.0, 225.0, 1.0, 1.0] Visible_Reflectance_Test: thr: [0.207, 0.169, 0.132, 1.0, 1.0] # used to be dlref1 adj: 0.94 # used to be dl_b1bias_adj @@ -25,6 +23,8 @@ Land_Day: dlvrat : [1.80, 1.85, 1.90, 1.0, 1.0] # dl11_12lcmult : 0.3 # dl11_12hcadj : 1.25 + CO2_High_Clouds_Test: [222.0, 224.0, 226.0, 1.0, 1.0] + Water_Vapor_High_Clouds_Test: [215.0, 220.0, 225.0, 1.0, 1.0] Land_Night: 11-12um_Cirrus_Test: @@ -37,14 +37,18 @@ Land_Night: 4-12um_BTD_Thin_Cirrus_Test: thr: [15.0, 10.0, 5.00, 1.0, 1.0] perform: True - CO2_High_Clouds_Test: [222.0, 224.0, 226.0, 1.0, 1.0] - Water_Vapor_High_Clouds_Test: [215.0, 220.0, 225.0, 1.0, 1.0] 7.3-11um_BTD_Mid_Level_Cloud_Test: thr: [-8.0, -10.0, -11.0, 1.0, 1.0] # nl7_11s - nl_11_4l : [0.0, -0.5, -1.0, 1.0] - nl_11_4h : [6.5, 6.0, 5.5, 1.0] - nl_11_4m : [-0.5, 6.0, 0.5, 1.0] - nl_11_4_pfm : 1.0 + 11-4um_BT_Difference_Test: + thr_low: [0.0, -0.5, -1.0, 1.0] + thr_mid: [-0.5, 6.0, 0.5, 1.0] + thr_hi: [6.5, 6.0, 5.5, 1.0] + coeffs: [-0.3476, 0.5307, -0.1930] + int_adj: 0 + ndvi: 0.25 + ndvi_australia: 0.4 + bt_diff_bounds : [1.0, -1.0] + perform: True Surface_Temperature_Test: desert_thr: 20.0 regular_thr: 12.0 @@ -54,18 +58,19 @@ Land_Night: # Surface_Temperature_Test_df1: [-0.2, 1.0] # Surface_Temperature_Test_df2: [-0.5, 1.0] # Surface_Temperature_Test_difference: [-0.2, 1.0, -0.5, 1.0] # <- this merges the previous two arrays - bt_diff_bounds : [1.0, -1.0] # Surface_Temperature_Test_1: 20.0 # | might be worth figuring out if we can # Surface_Temperature_Test_2: 12.0 # | merge these three coefficients # Surface_Temperature_Test_pfm: 1.0 # __| # Surface_Temperature_Test: [20.0, 12.0, 1.0] # <- First attempt to merge the three values above nlbt1 : 270.0 nl_lat : 30.0 - nl_ndvi : 0.25 - nl_ndvi_Aust : 0.40 - nl_intadj : 0.0 + # nl_ndvi : 0.25 + # nl_ndvi_Aust : 0.40 + # nl_intadj : 0.0 nl_btd1 : -2.0 - nl11_4coef : [-0.3476, 0.5307, -0.1930] + # nl11_4coef : [-0.3476, 0.5307, -0.1930] + CO2_High_Clouds_Test: [222.0, 224.0, 226.0, 1.0, 1.0] + Water_Vapor_High_Clouds_Test: [215.0, 220.0, 225.0, 1.0, 1.0] Land_Day_Coast: 11-12um_Cirrus_Test: @@ -222,10 +227,13 @@ Ocean_Night: 11-4um_Oceanic_Stratus_Test: thr: [1.25, 1.0, 0.25, 1.0, 1.0] perform: True - CO2_High_Clouds_Test: [222.0, 224.0, 226.0, 1.0, 1.0] - Water_Vapor_High_Clouds_Test: [215.0, 220.0, 225.0, 1.0, 1.0] - no86_73 : [14.0, 15.0, 16.0, 1.0, 1.0] - 11um_Variability_Test: [3.0, 6.0, 7.0, 1.0, 1.0] + Water_Vapor_Cloud_Test: + thr: [14.0, 15.0, 16.0, 1.0, 1.0] + perform: True + 11um_Variability_Test: + thr: [3.0, 6.0, 7.0, 1.0, 1.0] + variability: 0.40 + perform: True 11-4um_BT_Difference_Test: coeffs: [-0.7093, 0.1128, -0.1567] corr: 0.0 # no_intadj @@ -233,6 +241,8 @@ Ocean_Night: midpt_coeff: [-2.5, 2.5] # no11_4mdad hicut_coeff: [-1.5, 1.5] # no11_4hiad perform: True # no11_4_pfm + CO2_High_Clouds_Test: [222.0, 224.0, 226.0, 1.0, 1.0] + Water_Vapor_High_Clouds_Test: [215.0, 220.0, 225.0, 1.0, 1.0] Polar_Day_Land: 11-12um_Cirrus_Test: @@ -275,24 +285,32 @@ Polar_Night_Land: # Surface_Temperature_Test_2: 12.0 # | merge these three coefficients # Surface_Temperature_Test_pfm: 1.0 # __| # Surface_Temperature_Test: [20.0, 12.0, 1.0] # <- First attempt to merge the three values above - pnl_11_4_pfm : 1.0 - pnl_7_11_pfm : 1.0 - pnl_4_12_pfm : 1.0 + 11-4um_BT_Difference_Test: + low: [2.00, 1.70, 1.40, 1.0] + mid1: [1.70, 0.70, 0.3, 1.0] + mid2: [0.00, 0.00, 0.00, 0.0] + mid3: [0.00, 0.00, 0.00, 0.0] + high: [1.00, 0.70, 0.40, 1.0] + bt11_bounds: [235, 0, 0, 265] + perform: True 7.3-11um_BTD_Mid_Level_Cloud_Test: low: [-1.00, 0.00, 1.00, 1.0, 1.0] # pn_7_11l - mid1: [0.00, -4.50, -1.00, 1.0] # pn_7_11m1 + mid1: [0.00, -4.50, -1.00, 1.0] # pn_7_11m1 mid2: [-4.50, -10.50, -1.00, 1.0] # pn_7_11m2 mid3: [-10.50, -20.0, -1.00, 1.0] # pn_7_11m3 high: [-21.0, -20.0, -19.0,1.0] # pn_7_11h bt11_bounds: [220.0, 245.0, 255.0, 265.0] # bt11_bnds2 4-12um_BTD_Thin_Cirrus_Test: low: [2.00, 1.70, 1.40, 1.0] - mid1: [1.70, 0.70, 0.300, 1.0] - mid2: [0.00, 0.00, 0.00, 0.0] - mid3: [0.00, 0.00, 0.00, 0.0] - high: [1.00, 0.70, 0.40, 1.0] - bt11_bounds : [235.0, 000.0, 000.0, 265.0] + mid1: [1.70, 0.70, 0.300, 1.0] + mid2: [0.00, 0.00, 0.00, 0.0] + mid3: [0.00, 0.00, 0.00, 0.0] + high: [1.00, 0.70, 0.40, 1.0] + bt11_bounds: [235.0, 000.0, 000.0, 265.0] perform: True +# pnl_11_4_pfm : 1.0 +# pnl_7_11_pfm : 1.0 +# pnl_4_12_pfm : 1.0 Polar_Day_Coast: 11-12um_Cirrus_Test: @@ -370,14 +388,15 @@ Polar_Day_Snow: 1.38um_High_Cloud_Test: thr: [0.060, 0.0525, 0.045, 1.0, 1.0] perform: True + 11-4um_BT_Difference_Test: + low: [20.0, 18.0, 16.0, 1.0] + mid1: [18.0, 16.0, 2.0, 1.0] + mid2: [0.0, 0.0, 0.0, 0.0] + mid3: [0.0, 0.0, 0.0, 0.0] + high: [18.0, 16.0, 14.0, 1.0] + bt_11_bounds: [230.0, 0.0, 0.0, 245.0] + perform: True dps11_12adj : 0.8 - dps4_11l : [20.0, 18.0, 16.0, 1.0] - dps4_11h : [18.0, 16.0, 14.0, 1.0] - dps4_11m1 : [18.0, 16.0, 2.0, 1.0] - dps4_11m2 : [0.0, 0.0, 0.0, 0.0] - dps4_11m3 : [0.0, 0.0, 0.0, 0.0] - dps4_11_pfm : 1.0 - bt_11_bnds3 : [230.0, 0.0, 0.0, 245.0] Polar_Night_Snow: 11-12um_Cirrus_Test: @@ -407,21 +426,24 @@ Polar_Night_Snow: high_ice: [-21.0 -20.0, -19.0, 1.0] # pn_7_11hw bt11_bounds: [220.0, 245.0, 255.0, 265.0] # bt11_bnds2 Water_Vapor_High_Clouds_Test: [215.0, 220.0, 225.0, 1.0, 1.0] - pn_11_4l : [2.00, 1.70, 1.40, 1.0] - pn_11_4h : [0.60, 0.30, 0.00, 1.0] - pn_11_4m1 : [1.70, 0.30, 0.300, 1.0] - pn_11_4m2 : [0.00, 0.00, 0.00, 0.0] - pn_11_4m3 : [0.00, 0.00, 0.00, 0.0] - pns_11_4_pfm : 1.0 - pn_11_4bl : [-3.00, -2.50, -2.00, 1.0] - pn_11_4bh : [-3.00, -2.50, -2.00, 1.0] - pn_11_4bm1 : [-2.50, -2.50, -0.50, 1.0] - pn_11_4bm2 : [0.00, 0.00, 0.00, 0.0] - pn_11_4bm3 : [0.00, 0.00, 0.00, 0.0] + 11-4um_BT_Difference_Test: + top: + low: [2.00, 1.70, 1.40, 1.0] + mid1: [1.70, 0.30, 0.300, 1.0] + mid2: [0.00, 0.00, 0.00, 0.0] + mid3: [0.00, 0.00, 0.00, 0.0] + high: [0.60, 0.30, 0.00, 1.0] + bottom: + low: [-3.00, -2.50, -2.00, 1.0] + mid1: [-2.50, -2.50, -0.50, 1.0] + mid2: [0.00, 0.00, 0.00, 0.0] + mid3: [0.00, 0.00, 0.00, 0.0] + high: [-3.00, -2.50, -2.00, 1.0] + bt_thr: 230.0 # pnbt3 + tpw_thr: 0.2 # pntpw + perform: True pn11_12adj : 0.8 pnbt2 : 270.0 - pnbt3 : 230.0 - pntpw : 0.2 Polar_Day_Ocean: 11um_Test: @@ -491,9 +513,13 @@ Polar_Night_Ocean: 11-4um_Oceanic_Stratus_Test: thr: [1.25, 1.0, 0.25, 1.0, 1.0] perform: True - Water_Vapor_High_Clouds_Test: [215.0, 220.0, 225.0, 1.0, 1.0] - pno86_73 : [14.0, 15.0, 16.0, 1.0, 1.0] - 11um_Variability_Test: [3.0, 6.0, 7.0, 1.0, 1.0] + Water_Vapor_Cloud_Test: + thr: [14.0, 15.0, 16.0, 1.0, 1.0] + perform: True + 11um_Variability_Test: + thr: [3.0, 6.0, 7.0, 1.0, 1.0] + variability: 040 + perform: True 11-4um_BT_Difference_Test: coeffs: [-0.7093, 0.1128, -0.1567] corr: 0.0 # pno_intadj @@ -501,6 +527,7 @@ Polar_Night_Ocean: midpt_coeff: [-2.5, 2.5] # pno11_4mdad hicut_coeff: [-1.5, 1.5] # pno11_4hiad perform: True # pno11_4_pfm + Water_Vapor_High_Clouds_Test: [215.0, 220.0, 225.0, 1.0, 1.0] Day_Snow: @@ -515,10 +542,17 @@ Day_Snow: 1.38um_High_Cloud_Test: thr: [0.060, 0.0525, 0.045, 1.0, 1.0] perform: True + 11-4um_BT_Difference_Test: + low: [20.0, 18.0, 16.0, 1.0] + mid1: [18.0, 16.0, 2.0, 1.0] + mid2: [0.0, 0.0, 0.0, 0.0] + mid3: [0.0, 0.0, 0.0, 0.0] + high: [18.0, 16.0, 14.0, 1.0] + bt_11_bounds: [230.0, 0.0, 0.0, 245.0] + perform: True ds11_12adj : 0.8 ds11_12lcmult : 0.3 ds11_12hcmult : 0.3 - ds4_11_pfm : 1.0 Night_Snow: 11-12um_Cirrus_Test: @@ -528,11 +562,21 @@ Night_Snow: bt1: 270.0 perform: True nsbt2 : 270.0 - nsbt3 : 230.0 - ns11_4lo : [0.70, 0.60, 0.50, 1.0, 1.0] 4-12um_BTD_Thin_Cirrus_Test: thr: [4.50, 4.00, 3.50, 1.0, 1.0] perform: True + 11-4um_BT_Difference_Test: + thr: [0.70, 0.60, 0.50, 1.0, 1.0] + bottom: + low: [20.0, 18.0, 16.0, 1.0] + mid1: [18.0, 16.0, 2.0, 1.0] + mid2: [0.0, 0.0, 0.0, 0.0] + mid3: [0.0, 0.0, 0.0, 0.0] + high: [18.0, 16.0, 14.0, 1.0] + bt_11_bounds: [230.0, 0.0, 0.0, 245.0] + bt_thr: 230.0 + tpw_thr: 0.2 + perform: True 7.3-11um_BTD_Mid_Level_Cloud_Test: low: [-1.00, 0.00, 1.00, 1.0, 1.0] # pn_7_11l mid1: [0.00, -4.50, -1.00, 1.0] # pn_7_11m1 @@ -545,11 +589,10 @@ Night_Snow: mid3_ice: [-16.50, -20.0, -1.00, 1.0] # pn_7_11m3w high_ice: [-21.0 -20.0, -19.0, 1.0] # pn_7_11hw bt11_bounds: [220.0, 245.0, 255.0, 265.0] # bt11_bnds2 + perform: False CO2_High_Clouds_Test: [222.0, 224.0, 226.0, 1.0, 1.0] Water_Vapor_High_Clouds_Test: [215.0, 220.0, 225.0, 1.0, 1.0] ns11_12adj : 0.8 - nstpw : 0.2 - ns_7_11_pfm : 1.0 Antarctic_Day: Water_Vapor_High_Clouds_Test: [215.0, 220.0, 225.0, 1.0, 1.0]