dem_folder = '' modis_dem = 'modis_si_dem_250m' output_folder = r'C:\Users\conwayjp\OneDrive - NIWA\projects\DSC Snow\MODIS' # set up lists ann_ts_av_sca_m = [] ann_ts_av_sca_thres_m = [] ann_dt_m = [] ann_scd_m = [] for year_to_take in years_to_take: print('loading modis data {}'.format(year_to_take)) # load modis data for evaluation - trims to extent of catchment modis_fsca, modis_dt, modis_mask = load_subset_modis_annual( catchment, output_dem, year_to_take, modis_folder, dem_folder, modis_dem, mask_folder, catchment_shp_folder) modis_sc = modis_fsca >= modis_sc_threshold # print('calculating basin average sca') num_modis_gridpoints = np.sum(modis_mask) ba_modis_sca = [] ba_modis_sca_thres = [] for i in range(modis_fsca.shape[0]): ba_modis_sca.append(np.nanmean(modis_fsca[i, modis_mask]) / 100.0) ba_modis_sca_thres.append( np.nansum(modis_sc[i, modis_mask]).astype(np.double) / num_modis_gridpoints) # print('adding to annual series') ann_ts_av_sca_m.append(np.asarray(ba_modis_sca))
mask_folder = 'C:/Users/conwayjp/OneDrive - NIWA/Temp/DSC-Snow/Masks' catchment_shp_folder = 'C:/Users/conwayjp/OneDrive - NIWA/Data/GIS_DATA/Hydrology/Catchments' modis_folder = 'C:/Users/conwayjp/OneDrive - NIWA/Data/MODIS_snow/NSDI_SI_cloudfilled' dem_folder = 'C:/Users/conwayjp/OneDrive - NIWA/Data/GIS_DATA/Topography/DEM_NZSOS/' modis_dem = 'modis_si_dem_250m' met_inp_folder = 'D:/DSC-Snow/input_data_hourly' dsc_snow_dem_folder = 'C:/Users/conwayjp/OneDrive - NIWA/projects/DSC Snow/Projects-DSC-Snow/runs/input_DEM' output_folder = 'C:/Users/conwayjp/OneDrive - NIWA/projects/DSC Snow/Projects-DSC-Snow/runs/output/clutha_nztm250m_erebus' for year_to_take in years_to_take: print('loading modis data {}'.format(year_to_take)) # load modis data for evaluation modis_fsca, modis_dt, modis_mask = load_subset_modis_annual(catchment, year_to_take, modis_folder, modis_dem, mask_folder) # set up output array nt = modis_fsca.shape[0] ny = modis_fsca.shape[1] nx = modis_fsca.shape[2] ny_out = ny // rl # integer divide to ensure fits nx_out = nx // rl modis_fsca_rs = np.zeros((nt, ny_out, nx_out)) for i in range(nt): modis_sub = modis_fsca[i,] fsca_rs = resample_to_fsca(modis_sub, rl=rl) modis_fsca_rs[i] = fsca_rs # load model data
def calc_modis_catchment_metrics(catchment, years_to_take, mask_folder, modis_folder, modis_dem, output_folder): """ reads in and computes statistics on MODIS data for specific catchments. Requires that mask has been created using nz_snow_tools/util/generate_mask.py saves output to a pickle file :param catchment, # string identifying catchment modelled :param years_to_take :param modis_sc_threshold = 50 # value of fsca (in percent) that is counted as being snow covered :param mask_folder folder with numpy masks :param modis_folder folder with cloudfilled modis data :param modis_dem name of modis grid 'modis_nz_dem_250m' :param output_folder folder to put output pickle file """ # set up lists ann_ts_av_sca_m = [] ann_ts_av_sca_thres_m = [] ann_dt_m = [] ann_scd_m = [] for year_to_take in years_to_take: print('loading modis data {}'.format(year_to_take)) # load modis data for evaluation - trims to extent of catchment modis_fsca, modis_dt, modis_mask = load_subset_modis_annual(catchment, year_to_take, modis_folder, modis_dem, mask_folder) modis_sc = modis_fsca >= modis_sc_threshold # print('calculating basin average sca') num_modis_gridpoints = np.sum(modis_mask) ba_modis_sca = [] ba_modis_sca_thres = [] for i in range(modis_fsca.shape[0]): ba_modis_sca.append(np.nanmean(modis_fsca[i, modis_mask]) / 100.0) ba_modis_sca_thres.append(np.nansum(modis_sc[i, modis_mask]).astype(np.double) / num_modis_gridpoints) # print('adding to annual series') ann_ts_av_sca_m.append(np.asarray(ba_modis_sca)) ann_ts_av_sca_thres_m.append(np.asarray(ba_modis_sca_thres)) # print('calc snow cover duration') modis_scd = np.sum(modis_sc, axis=0) # count days with snow over threshold modis_scd[modis_mask == 0] = -999 # set areas outside catchment to -999 modis_scd[np.logical_and(np.isnan(modis_fsca[0]), modis_mask == 1)] = -1 # set areas of water to -1 # add to annual series ann_scd_m.append(modis_scd) ann_dt_m.append(modis_dt) # empty arrays so we don't run out of memory (probably not needed) modis_fsca = None modis_dt = None modis_mask = None modis_sc = None modis_scd = None ann = [ann_ts_av_sca_m, ann_ts_av_sca_thres_m, ann_dt_m, ann_scd_m] outfile = '/summary_MODIS_{}_{}_{}_{}_thres{}.pkl'.format(years_to_take[0], years_to_take[-1], catchment, modis_dem, modis_sc_threshold) pickle.dump(ann, open(output_folder + outfile, 'wb'), protocol=3) # repack into single timeseries sca = [] dts_m = [] for ts_av_sca_m, dt_m in zip(ann_ts_av_sca_m, ann_dt_m): sca.extend(ts_av_sca_m) dts_m.extend(dt_m) # dts_full = make_regular_timeseries(dt.datetime(years_to_take[0], 1, 1), dt.datetime(years_to_take[-1], 12, 31), 86400) outfile_nc = '/ts_MODIS_{}_{}_{}_{}_thres{}.nc'.format(years_to_take[0], years_to_take[-1], catchment, modis_dem, modis_sc_threshold) ds = nc.Dataset(output_folder + outfile_nc,'w') ds.created = strftime("%Y-%m-%d %H:%M:%S", gmtime()) ds.comment= 'catchment averaged fractional snow covered area generated with https://github.com/bodekerscientific/nz_snow_tools/eval/catchment_evaluation_modis.py' ds.createDimension('time', ) t = ds.createVariable('time', 'f8', ('time',)) t.long_name = "time" t.units = 'days since 1900-01-01 00:00:00' t[:] = nc.date2num(dts_m, units=t.units) fsca_var = ds.createVariable('fsca', 'f8', ('time',)) fsca_var.setncatts({'long_name': 'fractional snow covered area'}) fsca_var[:] = np.asarray(sca) ds.close()