diff --git a/main.py b/main.py index 10b5f1f34571df28759321e47ff3dab12ce0a523..eba3e025a5cdce92818443e2d972c2d2330c70c9 100644 --- a/main.py +++ b/main.py @@ -37,15 +37,55 @@ _eco_file = 'goge1_2_img.v1' # #################################################################### # -def main(*, data_path=_datapath, mod02=_fname_mod02, mod03=_fname_mod03, - img02=_fname_img02, img03=_fname_img03, threshold_file=_threshold_file, - geos_atm_1=_geos_atm_1, geos_atm_2=_geos_atm_2, geos_land=_geos_land, - geos_ocean=_geos_ocean, geos_constants=_geos_constants, ndvi_file=_ndvi_file, sst_file=_sst_file): - - # datapath = '/ships19/hercules/pveglio/neige_data/snpp_test_input' - # fname_l1b = 'VNP02MOD.A2014213.1548.001.2017301015346.uwssec.bowtie_restored_scaled.nc' - # fname_geo = 'VNP03MOD.A2014213.1548.001.2017301015705.uwssec.nc' - # thresh_file = '/home/pveglio/mvcm_leo/thresholds/new_thresholds.mvcm.snpp.v1.0.0.yaml' +def main(*, + data_path: str = _datapath, + mod02: str = _fname_mod02, + mod03: str = _fname_mod03, + img02: str = _fname_img02, + img03: str = _fname_img03, + threshold_file: str = _threshold_file, + geos_atm_1: str = _geos_atm_1, + geos_atm_2: str = _geos_atm_2, + geos_land: str = _geos_land, + geos_ocean: str = _geos_ocean, + geos_constants: str = _geos_constants, + ndvi_file: str = _ndvi_file, + sst_file: str = _sst_file) -> None: + """Main function for the MVCM. + + Parameters + ---------- + data_path: str + path where the data is stored + mod02: str + VIIRS MOD02 file name + mod03: str + VIIRS MOD03 file name + img02: str + VIIRS IMG02 file name + img03: str + VIIRS IMG03 file name + threshold_file: str + thresholds file name + geos_atm_1: str + file name of first GEOS5 file for atmospheric parameters + goes_atm_2: str + file name of second GEOS5 file for atmospheric parameters + geos_land: str + file name of GEOS5 land parameters + geos_ocean: str + file name of GEOS5 ocean parameters + geos_constants: str + file name of GEOS5 constants + ndvi_file: str + NDVI file name + sst_file: + Sea surface temperature file name + + Returns + ------- + None + """ file_names = {'MOD02': f'{mod02}', 'MOD03': f'{mod03}', @@ -69,36 +109,21 @@ def main(*, data_path=_datapath, mod02=_fname_mod02, mod03=_fname_mod03, viirs_data = rd.get_data(file_names, sunglint_angle) - # scene_xr = xr.Dataset() - # for s in scn._scene_list: - # scene_xr[s] = (('number_of_lines', 'number_of_pixels'), scn.scene_id[s]) - # scene_xr['latitude'] = viirs_xr.latitude - # scene_xr['longitude'] = viirs_xr.longitude - # - # viirs_data = xr.Dataset(viirs_xr, coords=scene_xr) - # viirs_data.drop_vars(['latitude', 'longitude']) - + # Initialize the confidence arrays for the various test groups cmin_G1 = np.ones(viirs_data.M01.shape) cmin_G2 = np.ones(viirs_data.M01.shape) cmin_G3 = np.ones(viirs_data.M01.shape) cmin_G4 = np.ones(viirs_data.M01.shape) cmin_G5 = np.ones(viirs_data.M01.shape) -# cmin_test = {'Ocean_Day': np.ones(viirs_data.M01.shape), -# 'Polar_Ocean_Day': np.ones(viirs_data.M01.shape), -# 'Polar_Ocean_Night': np.ones(viirs_data.M01.shape) -# } -# cmin2 = np.ones(viirs_data.M01.shape) -# cmin3 = np.ones(viirs_data.M01.shape) -# cmin4 = np.ones(viirs_data.M01.shape) - # ------------------- # # ### Testing Setup ### # ------------------- # - perform = {'11um BT Test': False, + + perform = {'11um BT Test': True, 'CO2 High Clouds Test': False, 'Water Vapor High Clouds Test': False, - 'Surface Temperature Test': True, + 'Surface Temperature Test': False, 'SST Test': False, '8.6-11um BT Difference Test': False, '11-12um BTD Thin Cirrus Test': False, diff --git a/read_data.py b/read_data.py index 2d940407f431ff9665ef8c829603eacc71aa5c00..166f1bd0127c6e7db1c173798fd8868186c7f03d 100644 --- a/read_data.py +++ b/read_data.py @@ -4,11 +4,15 @@ import numpy as np import ancillary_data as anc import scene as scn +from typing import Dict + _DTR = np.pi/180. _RTD = 180./np.pi -def read_data(sensor: str, l1b_filename: str, geo_filename: str): +def read_data(sensor: str, + l1b_filename: str, + geo_filename: str) -> xr.Dataset: in_data = xr.open_dataset(geo_filename, group='geolocation_data') @@ -41,12 +45,15 @@ def read_data(sensor: str, l1b_filename: str, geo_filename: str): return in_data -def relative_azimuth_angle(sensor_azimuth: float, solar_azimuth: float) -> float: +def relative_azimuth_angle(sensor_azimuth: np.ndarray, + solar_azimuth: np.ndarray) -> np.ndarray: rel_azimuth = np.abs(180. - np.abs(sensor_azimuth - solar_azimuth)) return rel_azimuth -def sun_glint_angle(sensor_zenith: float, solar_zenith: float, rel_azimuth: float) -> float: +def sun_glint_angle(sensor_zenith: np.ndarray, + solar_zenith: np.ndarray, + rel_azimuth: np.ndarray) -> np.ndarray: cossna = (np.sin(sensor_zenith*_DTR) * np.sin(solar_zenith*_DTR) * np.cos(rel_azimuth*_DTR) + np.cos(sensor_zenith*_DTR) * np.cos(solar_zenith*_DTR)) cossna[cossna > 1] = 1 @@ -54,7 +61,9 @@ def sun_glint_angle(sensor_zenith: float, solar_zenith: float, rel_azimuth: floa return sunglint_angle -def scattering_angle(solar_zenith, sensor_zenith, relative_azimuth): +def scattering_angle(solar_zenith: np.ndarray, + sensor_zenith: np.ndarray, + relative_azimuth: np.ndarray) -> np.ndarray: cos_scatt_angle = -1. * (np.cos(solar_zenith*_DTR) * np.cos(sensor_zenith*_DTR) - np.sin(solar_zenith*_DTR) * np.sin(sensor_zenith*_DTR) * np.cos(relative_azimuth*_DTR)) @@ -66,7 +75,9 @@ def correct_reflectances(): pass -def read_ancillary_data(file_names: str, viirs_data: float, resolution=1): +def read_ancillary_data(file_names: str, + viirs_data: xr.Dataset, + resolution: int = 1) -> xr.Dataset: # Ancillary files temporarily defined here. Eventually we will find a better way to pass these start_time = '2022-06-22 14:54:00.000' @@ -81,7 +92,7 @@ def read_ancillary_data(file_names: str, viirs_data: float, resolution=1): dim1 = viirs_data.latitude.shape[0] dim2 = viirs_data.latitude.shape[1] - print(dim1, dim2) + sst = np.empty((dim1*dim2, ), dtype=np.float32) ndvi = np.empty((dim1*dim2, ), dtype=np.float32) eco = np.empty((dim1*dim2, ), dtype=np.ubyte) @@ -97,22 +108,22 @@ def read_ancillary_data(file_names: str, viirs_data: float, resolution=1): sst = anc.py_get_Reynolds_SST(viirs_data.latitude.values.reshape((dim1*dim2, )), viirs_data.longitude.values.reshape((dim1*dim2, )), resolution, anc_dir, sst_file, sst) - print('sst') + print('SST read successfully') ndvi = anc.py_get_NDVI_background(viirs_data.latitude.values.reshape((dim1*dim2, )), viirs_data.longitude.values.reshape((dim1*dim2, )), resolution, anc_dir, ndvi_file, ndvi) + print('NDVI read successfully') - print('ndvi') eco = anc.py_get_Olson_eco(viirs_data.latitude.values.reshape((dim1*dim2, )), viirs_data.longitude.values.reshape((dim1*dim2, )), resolution, anc_dir, eco) + print('Olson eco read successfully') - print('eco') geos_data = anc.py_get_GEOS(viirs_data.latitude.values.reshape((dim1*dim2, )), viirs_data.longitude.values.reshape((dim1*dim2, )), resolution, start_time, anc_dir, geos1, geos2, geos_lnd, geos_ocn, geos_cnst, geos_data) - print('geos') + print('GEOS5 data read successfully') data = viirs_data data['sst'] = (('number_of_lines', 'number_of_pixels'), sst.reshape((dim1, dim2))) @@ -128,7 +139,8 @@ def read_ancillary_data(file_names: str, viirs_data: float, resolution=1): return data -def get_data(file_names, sunglint_angle): +def get_data(file_names: Dict[str, str], + sunglint_angle: float) -> xr.Dataset: mod02 = file_names['MOD02'] mod03 = file_names['MOD03'] @@ -136,7 +148,7 @@ def get_data(file_names, sunglint_angle): viirs_data = read_data('viirs', f'{mod02}', f'{mod03}') viirs_data = read_ancillary_data(file_names, viirs_data) - # Include channel differences and ratios that are used in the tests + # Compute channel differences and ratios that are used in the tests viirs_data['M15-M14'] = (('number_of_lines', 'number_of_pixels'), viirs_data.M15.values - viirs_data.M14.values) viirs_data['M15-M16'] = (('number_of_lines', 'number_of_pixels'),