diff --git a/tests/create_test_file.py b/tests/create_test_file.py new file mode 100644 index 0000000000000000000000000000000000000000..a3f69ae9c5999e8051e6ffc83fe6a2317ed01392 --- /dev/null +++ b/tests/create_test_file.py @@ -0,0 +1,198 @@ +"""Create test files.""" +from os.path import exists + +import numpy as np +import numpy.typing as npt +import xarray as xr + +import mvcm.read_data as rd + +# #################################################################### # +# TEST CASES +# data: +_datapath = "/ships19/hercules/pveglio/mvcm_viirs_hires" +_outpath = "/ships19/hercules/pveglio/mvcm_git_tests" + +# The following sets of files try to cover all the possible scenes found +# in the mvcm. the list of scenes per granule is reported on top of every +# VNP02/VNP03 group + +######################## +# Scene List: +# - Land_Day_Coast +# - Land_Day_Desert_Coast +# - Land_Day_Desert +# - Land_Day +# - Ocean_Day +# _fname_mod02 = f"{_datapath}/VNP02MOD.A2022173.1312.001.2022174011547.uwssec_bowtie_corrected.nc" +# _fname_mod03 = f"{_datapath}/VNP03MOD.A2022173.1312.001.2022174012746.uwssec.nc" +# _fname_img02 = f"{_datapath}/VNP02IMG.A2022173.1312.001.2022174011547.uwssec_bowtie_corrected.nc" +# _fname_img03 = f"{_datapath}/VNP03IMG.A2022173.1312.001.2022174012746.uwssec.nc" + +######################## +# Scene List: +# - Polar_Day_Coast +# - Polar_Day_Desert_Coast +# - Polar_Day_Desert +# - Polar_Day_Ocean +_fname_mod02 = f"{_datapath}/VNP02MOD.A2022173.1324.001.2022174014257.uwssec_bowtie_corrected.nc" +_fname_mod03 = f"{_datapath}/VNP03MOD.A2022173.1324.001.2022174012743.uwssec.nc" +# _fname_img02 = f"{_datapath}/VNP02IMG.A2022173.1324.001.2022174014257.uwssec_bowtie_corrected.nc" +# _fname_img03 = f"{_datapath}/VNP03IMG.A2022173.1324.001.2022174012743.uwssec.nc" + +######################## +# Scene List: +# - +# + +# output filename root +_out_fname = f"{_outpath}/test_scene" + +# ancillary files: +_geos_atm_1 = "GEOS.fpit.asm.inst3_2d_asm_Nx.GEOS5124.20220622_1200.V01.nc4" +_geos_atm_2 = "GEOS.fpit.asm.inst3_2d_asm_Nx.GEOS5124.20220622_1500.V01.nc4" +_geos_land = "GEOS.fpit.asm.tavg1_2d_lnd_Nx.GEOS5124.20220622_1330.V01.nc4" +_geos_ocean = "GEOS.fpit.asm.tavg1_2d_ocn_Nx.GEOS5124.20220622_1330.V01.nc4" +_geos_constants = "GEOS.fp.asm.const_2d_asm_Nx.00000000_0000.V01.nc4" +_ndvi_file = "NDVI.FM.c004.v2.0.WS.00-04.177.hdf" +_sst_file = "oisst.20220622" +_eco_file = "goge1_2_img.v1" + +# #################################################################### # + +# Scenes still unaccounted for: +# "Ocean_Night", +# "Polar_Night_Ocean", +# "Polar_Day_Land", +# "Polar_Day_Snow", +# "Land_Night", +# "Polar_Night_Land", +# "Polar_Night_Snow", +# "Day_Snow", +# "Night_Snow", + +_scene_list = [ + "Land_Day", + "Land_Day_Coast", + "Land_Day_Desert", + "Land_Day_Desert_Coast", + "Ocean_Day", + "Ocean_Night", + "Polar_Day_Ocean", + "Polar_Night_Ocean", + "Polar_Day_Land", + "Polar_Day_Coast", + "Polar_Day_Desert", + "Polar_Day_Desert_Coast", + "Polar_Day_Snow", + "Land_Night", + "Polar_Night_Land", + "Polar_Night_Snow", + "Day_Snow", + "Night_Snow", +] + +_default_scene_size = 10_000 + + +def find_scene(scene_arr: npt.NDArray[np.float64], x: int = 100, y: int = 100) -> tuple: + """Find X by Y area with same scene type.""" + i, j = None, None + flag = False + for i in range(scene_arr.shape[0] - x): + for j in range(scene_arr.shape[1] - y): + if (scene_arr[i : i + x, j : j + y] == np.ones((x, y))).all(): + flag = True + break + if flag is True: + break + if flag is False: + i = None + j = None + + return (i, j) + + +def main( + mod02: str, + mod03: str, + geos_atm_1: str, + geos_atm_2: str, + geos_land: str, + geos_ocean: str, + geos_constants: str, + ndvi_file: str, + sst_file: str, + eco_file: str, + data_path: str, + out_fname: str, +) -> None: + """Create test files.""" + file_names = { + "MOD02": f"{mod02}", + "MOD03": f"{mod03}", + "IMG02": None, + "IMG03": None, + "GEOS_atm_1": f"{geos_atm_1}", + "GEOS_atm_2": f"{geos_atm_2}", + "GEOS_land": f"{geos_land}", + "GEOS_ocean": f"{geos_ocean}", + "GEOS_constants": f"{geos_constants}", + "NDVI": f"{ndvi_file}", + "SST": f"{sst_file}", + "ECO": f"{eco_file}", + "ANC_DIR": f"{data_path}/ancillary", + } + + viirs_data = rd.get_data("snpp", "viirs", file_names, hires=False) + + out_ds = xr.Dataset() + + for scene in _scene_list: + print(f"scene: {scene}") + if exists(f"{out_fname}_{scene}.nc"): + continue + if len(viirs_data[scene].values[viirs_data[scene].values == 1]) < _default_scene_size: + continue + if scene in [ + "Land_Day_Coast", + "Land_Day_Desert_Coast", + "Polar_Day_Coast", + "Polar_Day_Desert_Coast", + ]: + scn_idx = list(np.nonzero(viirs_data[scene].values == 1)) + scn_idx = [scn_idx[0][:100], scn_idx[1][:100]] + else: + scn_tpl = find_scene(viirs_data[scene].values) + if scn_tpl[0] is None or scn_tpl[1] is None: + continue + scn_idx = [ + np.arange(scn_tpl[0], scn_tpl[0] + 100), + np.arange(scn_tpl[1], scn_tpl[1] + 100), + ] + if len(scn_idx[0]) == 0: + continue + + sample_data = xr.Dataset() + + for var in viirs_data: + sample_data[var] = viirs_data[var][scn_idx[0], scn_idx[1]] + + out_ds.to_netcdf(f"{out_fname}_{scene}.nc") + + +if __name__ == "__main__": + main( + mod02=_fname_mod02, + mod03=_fname_mod03, + 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, + eco_file=_eco_file, + data_path=_datapath, + out_fname=_out_fname, + )