diff --git a/main.py b/main.py index 32e01b3b63ba372dcd18ccb283775688b448a14c..10b5f1f34571df28759321e47ff3dab12ce0a523 100644 --- a/main.py +++ b/main.py @@ -195,7 +195,7 @@ def main(*, data_path=_datapath, mod02=_fname_mod02, mod03=_fname_mod03, pass if perform['11um BT Variability Test'] is True: - for scene_name in ['Polar_Night_Ocean']: + for scene_name in ['Ocean_Night', 'Polar_Night_Ocean']: pass if perform['11-4um BTD Oceanic Stratus'] is True: diff --git a/preprocess_thresholds.py b/preprocess_thresholds.py index fc7fc7fef76a9a928c30d6d20846d555c0f2f771..daf69b5b113944a046e22d2c9c0ef7a1c0ec8b4f 100644 --- a/preprocess_thresholds.py +++ b/preprocess_thresholds.py @@ -4,6 +4,8 @@ import xarray as xr import ancillary_data as anc import utils +from numpy.lib.stride_tricks import sliding_window_view + _dtr = np.pi/180 @@ -171,10 +173,142 @@ def preproc_surf_temp(data, thresholds): return thr_out -def get_b1_thresholds(): - # fill_ndvi[0] is for fill_ndvi1 - # fill_ndvi[1] is for fill_ndvi2 - pass +def var_11um(data, thresholds): + rad = data.M15.values + var = np.zeros((rad.shape[0], rad.shape[1], 9)) + var_thr = thresholds['Daytime_Ocean_Spatial_Variability']['dovar11'] + + test = sliding_window_view(np.pad(rad, [1, 1], mode='constant'), (3, 3)) - np.expand_dims(rad, (2, 3)) + + var[np.abs(test).reshape(rad.shape[0], rad.shape[1], 9) < var_thr] = 1 + var = var.sum(axis=2) + + return var + + +def get_b1_thresholds(data, thresholds): + ndvi = data.ndvi.values.reshape(data.ndvi.shape[0]*data.ndvi.shape[1]) + sctang = data.scattering_angle.values.reshape(data.ndvi.shape[0]*data.ndvi.shape[1]) + + # this is hardcoded in the function + delta_ndvi_bin = 0.1 + + des_ndvi = thresholds['Misc']['des_ndvi'] + thr_adj_fac_desert = thresholds['Misc']['adj_fac_desert'] + thr_adj_fac_land = thresholds['Misc']['adj_fac_land'] + ndvi_bnd1 = thresholds['Misc']['ndvi_bnd1'] + ndvi_bnd2 = thresholds['Misc']['ndvi_bnd2'] + fill_ndvi = thresholds['Misc']['fill_ndvi'] + + coeff1 = np.array(thresholds['Coeffs_Band1_land_thresh']).reshape(10, 3, 4) + coeff2 = np.zeros((10, 3, 4)) + coeff2[:3, :, :] = np.array(thresholds['Coeffs_Band8_land_thresh']).reshape(3, 3, 4) + coeff = np.stack((coeff1, coeff2)) + + indvi = np.zeros(ndvi.shape) + indvi[ndvi >= ndvi_bnd2] = 9 + + x, y2 = np.zeros(ndvi.shape), np.zeros(ndvi.shape) + + # this is equivalent to interp=1 in the C code + idx = np.nonzero((ndvi >= ndvi_bnd1) & (ndvi < ndvi_bnd2)) + + indvi[idx] = (ndvi[idx]/delta_ndvi_bin) - 0.5 + indvi[ndvi < 0] = 0 + + x1 = delta_ndvi_bin*indvi + delta_ndvi_bin/2.0 + x2 = x1 + delta_ndvi_bin + x[idx] = (ndvi[idx] - x1[idx])/(x2[idx] - x1[idx]) + x = np.clip(x, 0, 1) + + indvi = np.array(indvi, dtype=np.int) + thr = np.empty((ndvi.shape[0], 4)) + thr_adj = np.empty((ndvi.shape[0], 4)) + + for i in range(3): + y1 = coeff[0, indvi, i, 0] + coeff[0, indvi, i, 1]*sctang + \ + coeff[0, indvi, i, 2]*sctang**2 + coeff[0, indvi, i, 3]*sctang**3 + des = np.nonzero(ndvi < des_ndvi) + y1[des] = coeff[1, indvi[des], i, 0] + coeff[1, indvi[des], i, 1]*sctang[des] + \ + coeff[1, indvi[des], i, 2]*sctang[des]**2 + coeff[1, indvi[des], i, 3]*sctang[des]**3 + + y2[idx] = coeff[0, indvi[idx], i, 0] + \ + coeff[0, indvi[idx], i, 1]*sctang[idx] + \ + coeff[0, indvi[idx], i, 2]*sctang[idx]**2 + \ + coeff[0, indvi[idx], i, 3]*sctang[idx]**3 + idxdes = np.nonzero((ndvi >= ndvi_bnd1) & (ndvi < ndvi_bnd2) & (ndvi < des_ndvi)) + y2[idxdes] = coeff[0, indvi[idxdes], i, 0] + \ + coeff[0, indvi[idxdes], i, 1]*sctang[idxdes] + \ + coeff[0, indvi[idxdes], i, 2]*sctang[idxdes]**2 + \ + coeff[0, indvi[idxdes], i, 3]*sctang[idxdes]**3 + + thr[:, i] = (1.0 - x) + (x + y2) + thr_adj[:, i] = thr[:, i] * thr_adj_fac_desert + thr_adj[ndvi >= des_ndvi, i] = thr[ndvi >= des_ndvi, i] * thr_adj_fac_land + + hicut = ((thr[:, 0] + thr_adj[:, 0])/100) # .reshape(data.ndvi.shape) + midpt = ((thr[:, 1] + thr_adj[:, 1])/100) # .reshape(data.ndvi.shape) + locut = ((thr[:, 2] + thr_adj[:, 2])/100) # .reshape(data.ndvi.shape) + + idx = np.nonzero((ndvi >= fill_ndvi[0]) | (ndvi <= fill_ndvi[1])) + hicut[idx] = -999 + midpt[idx] = -999 + locut[idx] = -999 + +# out_thr = xr.DataArray(data=np.dstack((locut, midpt, hicut, np.ones(data.ndvi.shape), +# np.full(data.ndvi.shape, 2))), +# dims=('number_of_lines', 'number_of_pixels', 'z')) +# +# return out_thr + return locut, midpt, hicut + + +def vis_refl_thresholds(data, thresholds, scene): + + locut, midpt, hicut = get_b1_thresholds(data, thresholds) + bias_adj = thresholds[scene]['Visible_Reflectance_Test']['adj'] + ndvi = data.ndvi.values.reshape(data.ndvi.shape[0]*data.ndvi.shape[1]) + m01 = data.M05.values.reshape(data.ndvi.shape[0]*data.ndvi.shape[1]) + m02 = data.M07.values.reshape(data.ndvi.shape[0]*data.ndvi.shape[1]) + m08 = data.M01.values.reshape(data.ndvi.shape[0]*data.ndvi.shape[1]) + + m128 = m01 + + b1_locut = locut * bias_adj + b1_midpt = midpt * bias_adj + b1_hicut = hicut * bias_adj + + if ((scene == 'Land_Day_Desert') | (scene == 'Land_Day_Desert_Coast')): + ndvi_desert_thr = thresholds[scene]['Visible_Reflectance_Test']['ndvi_thr'] + idx = np.nonzero(ndvi < ndvi_desert_thr) + + b1_locut[idx] = locut[idx] + b1_midpt[idx] = midpt[idx] + b1_hicut[idx] = hicut[idx] + m128[idx] = m08[idx] + + b1_power = np.full(b1_locut.shape, 2) + + idx = np.nonzero(locut == -999) + b1_locut[idx] = thresholds[scene]['Visible_Reflectance_Test']['thr'][0] + b1_midpt[idx] = thresholds[scene]['Visible_Reflectance_Test']['thr'][1] + b1_hicut[idx] = thresholds[scene]['Visible_Reflectance_Test']['thr'][2] + b1_power[idx] = thresholds[scene]['Visible_Reflectance_Test']['thr'][3] + m128[idx] = m02[idx] + + cosvza = np.cos(data.sensor_zenith.values * _dtr).reshape(ndvi.shape) + + vzcpow = thresholds['VZA_correction']['vzcpow'][0] + b1_locut = (b1_locut * (1.0 / np.power(cosvza, vzcpow))).reshape(data.ndvi.shape) + b1_midpt = (b1_midpt * (1.0 / np.power(cosvza, vzcpow))).reshape(data.ndvi.shape) + b1_hicut = (b1_hicut * (1.0 / np.power(cosvza, vzcpow))).reshape(data.ndvi.shape) + + out_thr = xr.DataArray(data=np.dstack((b1_locut, b1_midpt, b1_hicut, np.ones(data.ndvi.shape), + b1_power.reshape(data.ndvi.shape))), + dims=('number_of_lines', 'number_of_pixels', 'z')) + out_rad = xr.DataArray(data=m128.reshape(data.M01.shape), dims=('number_of_lines', 'number_of_pixels')) + + return out_thr, out_rad # NOTE: 11-12um Cirrus Test diff --git a/tests.py b/tests.py index 8e79c3612125d50198ea085691704e5a4d0e65be..2debb8b829696f2342b3126a8ac278f157f426ea 100644 --- a/tests.py +++ b/tests.py @@ -280,6 +280,10 @@ class CloudTests: elif test_name == 'NIR_Reflectance_Test': corr_thr = pt.preproc_nir(self.data, self.thresholds, self.scene_name) thr_xr['threshold'] = (('number_of_lines', 'number_of_pixels', 'z'), corr_thr) + elif test_name == 'Visible_Reflectance_Test': + thr_xr['threshold'], self.data['M128'] = pt.vis_refl_thresholds(self.data, + self.thresholds, + self.scene_name) else: thr_xr['threshold'] = (('number_of_lines', 'number_of_pixels', 'z'), np.ones((self.data[band].shape[0], self.data[band].shape[1], 5))*thr) @@ -289,6 +293,11 @@ class CloudTests: data['sfcdif'] = (('number_of_lines', 'number_of_pixels'), pt.preproc_sst(data, self.thresholds[self.scene_name][test_name]).values) band = 'sfcdif' + if test_name == '11um_Variability_Test': + var = pt.var_11um(self.data, self.thresholds) + data['11um_var'] = data.M15 + data['11um_var'].values[var != 9] = np.nan + if test_name == 'NIR_Reflectance_Test': pass diff --git a/thresholds.mvcm.snpp.v0.0.1.yaml b/thresholds.mvcm.snpp.v0.0.1.yaml index 1f495c88f6ab2f20361d0148d9c4d89654c6a216..4debff3cecad2fe10b8770bf7e859f9283249e00 100644 --- a/thresholds.mvcm.snpp.v0.0.1.yaml +++ b/thresholds.mvcm.snpp.v0.0.1.yaml @@ -12,12 +12,13 @@ Land_Day: 11-4um_Oceanic_Stratus_Test: [-16.0, -14.0, -12.0, 1.0, 1.0] 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] - vis_refl_test : [0.207, 0.169, 0.132, 1.0, 1.0] # used to be dlref1 + 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 1.38um_High_Cloud_Test: [0.0375, 0.0250, 0.0125, 1.0, 1.0] dlvrat : [1.80, 1.85, 1.90, 1.0, 1.0] # dl11_12lcmult : 0.3 # dl11_12hcadj : 1.25 - b1bias_adj : 0.94 Land_Night: 11-12um_Cirrus_Test: @@ -59,7 +60,9 @@ Land_Day_Coast: 11-4um_Oceanic_Stratus_Test: [-16.0, -14.0, -12.0, 1.0, 1.0] 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] - dlref1_t2 : [0.207, 0.169, 0.132, 1.0, 1.0] + Visible_Reflectance_Test: + thr: [0.207, 0.169, 0.132, 1.0, 1.0] + adj: 0.94 1.38um_High_Cloud_Test: [0.0375, 0.0250, 0.0125, 1.0, 1.0] # dl11_12lcmult_t2 : 0.3 # dl11_12hcadj_t2 : 1.25 @@ -74,14 +77,16 @@ Land_Day_Desert: lds11_4lo : [-28.0, -26.0, -24.0, 1.00] 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] - ldsref2 : [0.326, 0.288, 0.250, 1.00, 1.0] + Visible_Reflectance_Test: + thr: [0.326, 0.288, 0.250, 1.00, 1.0] + adj: 0.94 + ndvi_thr: 0.25 # this used to be lds_ndvi 1.38um_High_Cloud_Test: [0.0375, 0.0250, 0.0125, 1.00, 1.0] ldsgemi0 : [0.085, 0.095, 0.115, 1.00, 1.0] ldsgemi1 : [0.145, 0.170, 0.220, 1.00] ldsgemi2 : [0.310, 0.335, 0.360, 1.00] lds_ref3_tpw : -10.00 ldsbt1 : 320.0 - lds_ndvi : 0.25 # lds11_12lcmult : 0.3 # lds11_12hcadj : 1.25 @@ -95,11 +100,13 @@ Land_Day_Desert_Coast: lds11_4lo_c : [-23.0, -21.0, -19.0, 1.00, 1.0] 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] - ldsref2_c : [0.326, 0.288, 0.250, 1.00, 1.0] + Visible_Reflectance_Test: + thr: [0.326, 0.288, 0.250, 1.00, 1.0] + adj: 0.94 + ndvi_thr: 0.25 1.38um_High_Cloud_Test: [0.0375, 0.0250, 0.0125, 1.00, 1.0] lds_ref3_tpw_c : -10.00 ldsbt1_c : 320.0 - lds_ndvi_c : 0.25 # lds11_12lcmult_c : 0.3 # lds11_12hcadj_c : 1.25 @@ -154,7 +161,7 @@ Ocean_Night: 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_var : [3.0, 6.0, 7.0, 1.0, 1.0] + 11um_Variability_Test: [3.0, 6.0, 7.0, 1.0, 1.0] 8.6-11um_Test: [-0.5, -1.0, -1.5, 1.0, 1.0] SST_Test: thr: [3.000, 2.500, 2.000, 1.0, 1.0] @@ -172,8 +179,10 @@ Polar_Day_Land: adj: 0.3 pdl_ref3_tpw : -10.00 11-4um_Oceanic_Stratus_Test: [-16.0, -14.0, -12.0, 1.0, 1.0] - pdlh20 : [215.0, 220.0, 225.0, 1.0, 1.0] - pdlref1 : [0.207, 0.169, 0.132, 1.0, 1.0] + pdlh20 : [215.0, 220.0, 225.0, 1.0, 1.0] + Visible_Reflectance_Test: + thr: [0.207, 0.169, 0.132, 1.0, 1.0] + adj: 0.94 1.38um_High_Cloud_Test: [0.0375, 0.0250, 0.0125, 1.0, 1.0] Polar_Night_Land: @@ -209,7 +218,9 @@ Polar_Day_Coast: pdl_ref3_tpw_t2 : -10.00 11-4um_Oceanic_Stratus_Test: [-16.0, -14.0, -12.0, 1.0, 1.0] Water_Vapor_High_Clouds_Test: [215.0, 220.0, 225.0, 1.0, 1.0] - pdlref1_t2 : [0.207, 0.169, 0.132, 1.0, 1.0] + Visible_Reflectance_Test: + thr: [0.207, 0.169, 0.132, 1.0, 1.0] + adj: 0.94 1.38um_High_Cloud_Test: [0.0375, 0.0250, 0.0125, 1.0, 1.0] Polar_Day_Desert: @@ -221,7 +232,9 @@ Polar_Day_Desert: pds11_4lo : [-22.0, -20.0, -18.0, 1.00] pds11_4_pfm : 1.0 Water_Vapor_High_Clouds_Test: [215.0, 220.0, 225.0, 1.0, 1.0] - pdsref2 : [0.326, 0.288, 0.250, 1.00, 1.0] + Visible_Reflectance_Test: + thr: [0.326, 0.288, 0.250, 1.00, 1.0] + adj: 0.94 1.38um_High_Cloud_Test: [0.0375, 0.0250, 0.0125, 1.00, 1.0] pdsgemi0 : [0.085, 0.110, 0.135, 1.00, 1.0] pdsgemi1 : [0.170, 0.220, 0.270, 1.00] @@ -238,7 +251,9 @@ Polar_Day_Desert_Coast: pds11_4lo_c : [-23.0, -21.0, -19.0, 1.00] pds11_4_c_pfm : 1.0 Water_Vapor_High_Clouds_Test: [215.0, 220.0, 225.0, 1.0, 1.0] - pdsref2_c : [0.326, 0.288, 0.250, 1.00, 1.0] + Visible_Reflectance_Test: + thr: [0.326, 0.288, 0.250, 1.00, 1.0] + adj: 0.94 1.38um_High_Cloud_Test: [0.0375, 0.0250, 0.0125, 1.00, 1.0] pds_ref3_tpw_c : -10.00 pdsbt1_c : 320.0 @@ -341,7 +356,7 @@ Polar_Ocean_Night: 11um_Test: [267.0, 270.0, 273.0, 1.0, 1.0] 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] - pno_11var : [3.0, 6.0, 7.0, 1.0, 1.0] + 11um_Variability_Test: [3.0, 6.0, 7.0, 1.0, 1.0] 8.6-11um_Test: [-0.5, -1.0, -1.5, 1.0, 1.0] SST_Test: thr: [3.000, 2.500, 2.000, 1.0, 1.0]