def compare_pre_post_1100_noise(X,L=31,latbounds=None): time1=('1100-1-1','1399-12-31') c1=cm.Purples(.8) time2=('1400-1-1','2005-12-31') if latbounds is not None: obs=X.obs(latitude=latbounds) mma = MV.average(X.model(latitude=latbounds),axis=0) mma = mask_data(mma,obs[0].mask) solver = Eof(mma) obs = mask_data(obs,solver.eofs()[0].mask) truncnoise=solver.projectField(obs)[:,0]*da.get_orientation(solver) noisy1=truncnoise(time=time1) noisy2=truncnoise(time=time2) else: noisy1=X.noise(time=time1) noisy2=X.noise(time=time2) c2=cm.viridis(.1) plt.subplot(121) Plotting.Plotting.time_plot(noisy1,c=c1) Plotting.Plotting.time_plot(noisy2,c=c2) plt.ylabel("Projection") plt.title("(a): Noise time series") plt.subplot(122) plt.hist(b.bootstrap_slopes(noisy1,L),color=c1,normed=True,alpha=.5) da.fit_normals_to_data(b.bootstrap_slopes(noisy1,L),c=c1,label="1100-1400") plt.hist(b.bootstrap_slopes(noisy2,L),color=c2,normed=True,alpha=.5) da.fit_normals_to_data(b.bootstrap_slopes(noisy2,L),c=c2,label="1400-2005") plt.legend() plt.title("(b): 31-year trend distributions") return np.std(b.bootstrap_slopes(noisy1,L)),np.std(b.bootstrap_slopes(noisy2,L))
def project_piControl_on_solver(self, solver=None): direc = "/Volumes/Marvel/PICTRL/PDSI_REGRIDDED_SUMMER/" files = glob.glob(direc + "*") npiC = len(files) fname = files[0] f = cdms.open(fname) piC_pdsi_regrid = f("pdsi_summer") piC_pdsi_regrid = MV.masked_where(np.isnan(piC_pdsi_regrid), piC_pdsi_regrid) mask = self.solver.eofs()[0].mask # grid=self.model.getGrid() nyears = piC_pdsi_regrid.shape[0] # tax=cdms.createAxis(np.arange(piC_pdsi.shape[0])) # tax.designateTime() # tax.units = 'years since 0000-7-1' # tax.id="time" # piC_pdsi.setAxis(0,tax) # piC_pdsi_regrid = piC_pdsi.regrid(grid,regridTool='regrid2') piC_mask = mask_data(piC_pdsi_regrid, mask) newmask = np.prod(~piC_mask.mask, axis=0) if solver is None: solver = Eof(mask_data(self.mma, newmask == 0), weights='area') fac = da.get_orientation(solver) p = solver.projectField(piC_mask)[:, 0] * fac for i in range(npiC)[1:]: fname = files[i] f = cdms.open(fname) piC_pdsi_regrid = f("pdsi_summer") piC_pdsi_regrid = MV.masked_where(np.isnan(piC_pdsi_regrid), piC_pdsi_regrid) # piC_pdsi = MV.masked_where(np.isnan(piC_pdsi),piC_pdsi) nyears += piC_pdsi_regrid.shape[0] # tax=cdms.createAxis(np.arange(piC_pdsi.shape[0])) # tax.designateTime() # tax.units = 'years since 0000-7-1' # tax.id="time" # piC_pdsi.setAxis(0,tax) # piC_pdsi_regrid = piC_pdsi.regrid(grid,regridTool='regrid2') piC_mask = mask_data(piC_pdsi_regrid, mask) newmask = np.prod(~piC_mask.mask, axis=0) solver = Eof(mask_data(self.mma, newmask == 0), weights='area') fac = da.get_orientation(solver) f.close() p = MV.concatenate((p, fac * solver.projectField(piC_mask)[:, 0])) tax = cdms.createAxis(np.arange(nyears)) tax.designateTime() tax.units = 'years since 0000-7-1' tax.id = "time" p.setAxis(0, tax) return p
def project_dai_on_solver(self,start='1970-1-1'): f = cdms.open("../DROUGHT_ATLAS/OBSERVATIONS/DAI_selfcalibrated.nc") dai_jja=f("pdsi") f.close() dai_jja_mask = mask_data(dai_jja,self.obs[0].mask)(time=(start,'2018-12-31')) newmask = np.prod(~dai_jja_mask.mask,axis=0) dai_jja_mask = mask_data(dai_jja_mask,newmask==0) solver = Eof(mask_data(self.mma,newmask==0)) dai_jja_mask = mask_data(dai_jja_mask,solver.eofs()[0].mask) fac = da.get_orientation(solver) return solver.projectField(dai_jja_mask)[:,0]*fac
def model_projections(self): to_proj = mask_data(self.model,self.solver.eofs()[0].mask) P=MV.zeros(to_proj.shape[:2]) for i in range(to_proj.shape[0]): tp = to_proj[i] mma_mask = mask_data(self.mma,tp[0].mask) solver = Eof(mma_mask) fac=da.get_orientation(solver) P[i] = solver.projectField(tp)[:,0]*fac P.setAxisList(to_proj.getAxisList()[:2]) self.P=P
def project_cru_on_solver(self, start='1970-1-1', solver=None): f = cdms.open("../DROUGHT_ATLAS/OBSERVATIONS/CRU_selfcalibrated.nc") cru_jja = f("pdsi") f.close() cru_jja_mask = mask_data(cru_jja, self.obs[0].mask)(time=(start, '2018-12-31')) newmask = np.prod(~cru_jja_mask.mask, axis=0) cru_jja_mask = mask_data(cru_jja_mask, newmask == 0) if solver is None: solver = Eof(mask_data(self.mma, newmask == 0), weights='area') cru_jja_mask = mask_data(cru_jja_mask, solver.eofs()[0].mask) fac = da.get_orientation(solver) return solver.projectField(cru_jja_mask)[:, 0] * fac
def project_piControl_on_solver(self, depth): if depth in self.noise.keys(): pass else: direc = "/Volumes/Marvel/PICTRL/SM" + depth + "_REGRIDDED_SUMMER/" files = glob.glob(direc + "*") npiC = len(files) fname = files[0] f = cdms.open(fname) piC_pdsi_regrid = f("sm" + depth + "_summer") piC_pdsi_regrid = MV.masked_where(np.isnan(piC_pdsi_regrid), piC_pdsi_regrid) mask = self.solvers[depth].eofs()[0].mask grid = self.soilmoisture[depth].getGrid() nyears = piC_pdsi_regrid.shape[0] piC_mask = mask_data(piC_pdsi_regrid, mask) newmask = np.prod(~piC_mask.mask, axis=0) solver = Eof(mask_data(self.mma[depth], newmask == 0), weights='area') fac = da.get_orientation(solver) p = solver.projectField(piC_mask)[:, 0] * fac for i in range(npiC)[1:]: fname = files[i] f = cdms.open(fname) piC_pdsi_regrid = f("sm" + depth + "_summer") piC_pdsi_regrid = MV.masked_where(np.isnan(piC_pdsi_regrid), piC_pdsi_regrid) nyears += piC_pdsi_regrid.shape[0] piC_mask = mask_data(piC_pdsi_regrid, mask) newmask = np.prod(~piC_mask.mask, axis=0) solver = Eof(mask_data(self.mma[depth], newmask == 0), weights='area') fac = da.get_orientation(solver) f.close() p = MV.concatenate( (p, fac * solver.projectField(piC_mask)[:, 0])) tax = cdms.createAxis(np.arange(nyears)) tax.designateTime() tax.units = 'years since 0000-7-1' tax.id = "time" p.setAxis(0, tax) self.noise[depth] = p
def standardize_soilmoisture(dataset): f = cdms.open("../DROUGHT_ATLAS/PROCESSED/ALL_ANZDA.nc") obs = f("pdsi") obs = MV.masked_where(np.isnan(obs), obs) obs = MV.masked_where(np.abs(obs) > 90, obs) obs = obs(time=('1921-1-1', '2000-12-31')) pdsi = mask_data( obs, obs.mask[0] ) #Make all the obs have the same mask as the first datapoint f.close() mu_p = MV.average(pdsi, axis=0) sig_p = genutil.statistics.std(pdsi, axis=0) f = cdms.open("../DROUGHT_ATLAS/OBSERVATIONS/" + dataset + "_soilmoisture_summerseason.nc") gleam30cm = f("smsurf") mask = pdsi[0].mask gleam30cmmask = b.mask_data(gleam30cm, mask) mu_s = MV.average(gleam30cmmask, axis=0) sig_s = genutil.statistics.std(gleam30cmmask, axis=0) surf = (gleam30cmmask - mu_s + mu_p) * (sig_p / sig_s) gleam2m = f("smroot") mask = pdsi[0].mask gleam2mmask = b.mask_data(gleam2m, mask) mu_s2 = MV.average(gleam2mmask, axis=0) sig_s2 = genutil.statistics.std(gleam2mmask, axis=0) root = (gleam2mmask - mu_s2 + mu_p) * (sig_p / sig_s) return surf, root
def get_tree_ring_projection(self, solver=None): if solver is None: return self.projection else: fac = da.get_orientation(solver) projection = solver.projectField(mask_data( self.obs, self.eofmask))[:, 0] * fac return projection
def get_noise(self, solver=None): if solver is None: return self.noise else: proj = solver.projectField(mask_data( self.obs, self.eofmask))[:, 0] * da.get_orientation(solver) noise = proj(time=('1-1-1', '1850-1-1')) return noise
def regional_DA(OWDA, region, start_time=None, typ='fingerprint', return_noise=False): if start_time is None: start_time = cdtime.comptime(2000, 1, 1) times = np.arange(10, 76) modeldata = mask_data(OWDA.model(region), OWDA.obs(region)[0].mask) if typ == 'fingerprint': mma = MV.average(modeldata, axis=0) solver = Eof(mma, weights='area') to_proj = mask_data(modeldata, solver.eofs()[0].mask) P = MV.zeros(to_proj.shape[:2]) for i in range(to_proj.shape[0]): tp = to_proj[i] mma_mask = mask_data(mma, tp[0].mask) solver = Eof(mma_mask, weights='area') fac = da.get_orientation(solver) P[i] = solver.projectField(tp)[:, 0] * fac P.setAxisList(to_proj.getAxisList()[:2]) noise = solver.projectField(OWDA.obs(region))[:, 0] else: P = cdutil.averager(modeldata, axis='xy') noise = cdutil.averager(OWDA.obs(region), axis='xy') if return_noise: return P, noise else: nmod, nyears = P.shape TOE = MV.zeros((nmod, len(times))) for i in range(len(times)): L = times[i] stop_time = start_time.add(L, cdtime.Years) modslopes = cmip5.get_linear_trends(P(time=(start_time, stop_time))) noiseterm = np.std(bootstrap_slopes(noise, L)) TOE[:, i] = modslopes / noiseterm TOE.setAxis(0, P.getAxis(0)) return TOE
def model_projections(self, depth): if depth in self.P.keys(): pass else: to_proj = mask_data(self.soilmoisture[depth], self.solvers[depth].eofs()[0].mask) P = MV.zeros(to_proj.shape[:2]) for i in range(to_proj.shape[0]): tp = to_proj[i] mma_mask = mask_data(self.mma[depth], tp[0].mask) solver = Eof(mma_mask, weights='area') tp = mask_data(tp, solver.eofs()[0].mask) fac = da.get_orientation(solver) P[i] = solver.projectField(tp)[:, 0] * fac P.setAxisList(to_proj.getAxisList()[:2]) self.P[depth] = P self.P[depth].getTime().id = "time"
def mask_models(CO, writename=None): """Create mask based on availability of observations at first time step and apply to CMIP5 hist+85 PDSI.""" f = cdms.open("../DROUGHT_ATLAS/CMIP5/pdsi.ensemble.hist.rcp85.nc") models = f("pdsi") models = MV.masked_where(np.isnan(models), models) masked_models = mask_data(models, CO[0].mask) masked_models.id = 'pdsi' if writename is not None: fw = cdms.open(writename, "w") fw.write(masked_models) fw.close() return masked_models
def truncated_solver(D,the_start=None,the_stop=None,include_cru=False,include_dai=False): thedata = D.ALL.model(time=(the_start,the_stop)) the_mma=MV.average(cmip5.ensemble2multimodel(thedata),axis=0) if include_cru: f = cdms.open("../DROUGHT_ATLAS/OBSERVATIONS/CRU_selfcalibrated.nc") cru_jja=f("pdsi") f.close() cru_jja_mask = mask_data(cru_jja,D.ALL.obs[0].mask)(time=(the_start,'2018-12-31')) newmask = np.prod(~cru_jja_mask.mask,axis=0) cru_jja_mask = mask_data(cru_jja_mask,newmask==0) thesolver = Eof(mask_data(D.ALL.mma(time=(the_start,the_stop)),newmask==0),weights='area') elif include_dai: f = cdms.open("../DROUGHT_ATLAS/OBSERVATIONS/DAI_selfcalibrated.nc") dai_jja=f("pdsi") f.close() dai_jja_mask = mask_data(dai_jja,D.ALL.obs[0].mask)(time=(the_start,'2018-12-31')) newmask = np.prod(~dai_jja_mask.mask,axis=0) dai_jja_mask = mask_data(dai_jja_mask,newmask==0) thesolver = Eof(mask_data(D.ALL.mma(time=(the_start,the_stop)),newmask==0),weights='area') else: thesolver = Eof(the_mma,weights="area") return thesolver
def soilmoisture(depth,mask=None): if depth == "pdsi": f = cdms.open("../DROUGHT_ATLAS/CMIP5/pdsi.ensemble.hist.rcp85.nc") variable="pdsi" else: f = cdms.open("../DROUGHT_ATLAS/CMIP5/sm"+depth+".ensemble.hist.rcp85.nc") variable = "sm"+depth sm = get_rid_of_bad(f(variable)) sm = MV.masked_where(np.isnan(sm),sm) f.close() if mask is not None: sm = mask_data(sm,mask) return sm
def model_projections(self, solver=None): if solver is None: make_own_solver = True else: make_own_solver = False if solver is None: to_proj = mask_data(self.model, self.solver.eofs()[0].mask) else: to_proj = cmip5.cdms_clone(MV.filled(self.model, fill_value=0), self.model) to_proj = mask_data(to_proj, solver.eofs()[0].mask) P = MV.zeros(to_proj.shape[:2]) for i in range(to_proj.shape[0]): tp = to_proj[i] if make_own_solver: mma_mask = mask_data(self.mma, tp[0].mask) solver = Eof(mma_mask, weights='area') fac = da.get_orientation(solver) P[i] = solver.projectField(tp)[:, 0] * fac P.setAxisList(to_proj.getAxisList()[:2]) return P
def write_combinations(): """ Make t combined NH drought atlases: ALL_OBS, which starts in 1100 and includes MADA, OWDA, and NADA, and ALL_OBS_plus_MEX, which includes the former + MXDA """ list_of_obs = [] for atlas_name in ["OWDA2.5", "MADA2.5", "NADA2.5"]: f = cdms.open("../DROUGHT_ATLAS/PROCESSED/" + atlas_name + ".nc") obs = f("pdsi") obs = MV.masked_where(np.isnan(obs), obs) obs = MV.masked_where(np.abs(obs) > 90, obs) obs = obs(time=('1100-7-1', '2020-12-31')) obs = mask_data( obs, obs.mask[0] ) #Make all the obs have the same mask as the first datapoint f.close() list_of_obs += [obs] writename = "../DROUGHT_ATLAS/PROCESSED/ALL_OBS.nc" CO = combine_observations(list_of_obs, writename=writename) modelwritename = "../DROUGHT_ATLAS/CMIP5/pdsi.ALL_OBS.hist.rcp85.nc" mm = mask_models(CO, writename=modelwritename) #now add in MXDA: atlas_name = "MXDA2.5" f = cdms.open("../DROUGHT_ATLAS/PROCESSED/" + atlas_name + ".nc") obs = f("pdsi") obs = MV.masked_where(np.isnan(obs), obs) obs = MV.masked_where(np.abs(obs) > 90, obs) obs = obs(time=('1100-7-1', '2020-12-31')) obs = mask_data( obs, obs.mask[0] ) #Make all the obs have the same mask as the first datapoint f.close() list_of_obs += [obs] writename = "../DROUGHT_ATLAS/PROCESSED/ALL_OBS_plus_MEX.nc" CO = combine_observations(list_of_obs, writename=writename) modelwritename = "../DROUGHT_ATLAS/CMIP5/pdsi.ALL_OBS_plus_MEX.hist.rcp85.nc" mm = mask_models(CO, writename=modelwritename)
def write_big_drought_atlas(): list_of_obs = [] for atlas_name in ["OWDA2.5", "MADA2.5", "NADA2.5", "MXDA2.5", "ANZDA2.5"]: f = cdms.open("../DROUGHT_ATLAS/PROCESSED/" + atlas_name + ".nc") obs = f("pdsi") obs = MV.masked_where(np.isnan(obs), obs) obs = MV.masked_where(np.abs(obs) > 90, obs) obs = obs(time=('1100-7-1', '2020-12-31')) obs = mask_data( obs, obs.mask[0] ) #Make all the obs have the same mask as the first datapoint f.close() list_of_obs += [obs] writename = "../DROUGHT_ATLAS/PROCESSED/ALL_ANZDA.nc" CO = combine_observations(list_of_obs, writename=writename) modelwritename = "../DROUGHT_ATLAS/CMIP5/pdsi.ALL_ANZDA.hist.rcp85.nc" mm = mask_models(CO, writename=modelwritename)
def write_regridded(): fnames = glob.glob("../DROUGHT_ATLAS/PROCESSED/*") for fil in fnames: atlas_name = fil.split("/")[-1].split(".")[0] if atlas_name != "ANZDA": f = cdms.open("../DROUGHT_ATLAS/PROCESSED/" + atlas_name + ".nc") obs = f("pdsi") obs = MV.masked_where(np.isnan(obs), obs) obs = MV.masked_where(np.abs(obs) > 90, obs) obs = obs(time=('1100-7-1', '2020-12-31')) obs = mask_data( obs, obs.mask[0] ) #Make all the obs have the same mask as the first datapoint f.close() writefname = "../DROUGHT_ATLAS/PROCESSED/" + atlas_name + "2.5.nc" CO = combine_observations([obs], grid='2.5', writename=writefname) modelwritename = "../DROUGHT_ATLAS/CMIP5/pdsi." + atlas_name + "2.5.hist.rcp85.nc" mm = mask_models(CO, writename=modelwritename)
def exclude_NADA(): """ Make a combined NH drought atlas ALL_NONADA, which starts in 1400 and includes MADA, OWDA, ANZDA but NOT NADA """ list_of_obs = [] for atlas_name in ["OWDA2.5", "MADA2.5", "MXDA2.5", "ANZDA2.5"]: f = cdms.open("../DROUGHT_ATLAS/PROCESSED/" + atlas_name + ".nc") obs = f("pdsi") obs = MV.masked_where(np.isnan(obs), obs) obs = MV.masked_where(np.abs(obs) > 90, obs) obs = obs(time=('1400-7-1', '2020-12-31')) obs = mask_data( obs, obs.mask[0] ) #Make all the obs have the same mask as the first datapoint f.close() list_of_obs += [obs] writename = "../DROUGHT_ATLAS/PROCESSED/ALL_NONADA.nc" CO = combine_observations(list_of_obs, writename=writename) modelwritename = "../DROUGHT_ATLAS/CMIP5/pdsi.ALL_NONADA.hist.rcp85.nc" mm = mask_models(CO, writename=modelwritename)
def individual_plots(): fnames = glob.glob("../DROUGHT_ATLAS/PROCESSED/ORIGINAL_GRID/*") for fil in fnames: atlas_name = fil.split("/")[-1].split(".")[0] f = cdms.open("../DROUGHT_ATLAS/PROCESSED/ORIGINAL_GRID/" + atlas_name + ".nc") obs = f("pdsi") obs = MV.masked_where(np.isnan(obs), obs) obs = MV.masked_where(np.abs(obs) > 90, obs) obs = obs(time=('1400-7-1', '2005-12-31')) obs = mask_data( obs, obs.mask[0] ) #Make all the obs have the same mask as the first datapoint f.close() plt.figure() m = plot_regional(obs[-1], atlas_name, vmin=-6, vmax=6) plt.title(atlas_name + ": 2005 PDSI") m.drawcoastlines(color="gray") plt.tight_layout() plt.savefig("../DroughtAtlasPaper/FIGS/ForTalk/" + atlas_name + "_2005.png") plt.close()
def project_soilmoisture(self, dataset): mask = self.mask self.OBS_PROJECTIONS[dataset] = {} surf, root = standardize_soilmoisture(dataset) surfsolver = Eof(mask_data(self.mma["30cm"], mask), weights='area') surfmask = mask_data(surf, surfsolver.eofs()[0].mask) surfsolver = Eof(mask_data(self.mma["30cm"], surfmask[-1].mask), weights='area') surfanom = surfmask - MV.average(surfmask, axis=0) self.OBS_PROJECTIONS[dataset]["30cm"] = surfsolver.projectField( surfanom)[:, 0] * da.get_orientation(surfsolver) rootsolver = Eof(mask_data(self.mma["2m"], mask), weights='area') rootmask = mask_data(root, rootsolver.eofs()[0].mask) rootsolver = Eof(mask_data(self.mma["2m"], rootmask[-1].mask), weights='area') rootanom = rootmask - MV.average(rootmask, axis=0) self.OBS_PROJECTIONS[dataset]["2m"] = rootsolver.projectField( rootanom)[:, 0] * da.get_orientation(rootsolver)
def observations(): # Read in PET and PR files #regridded PET f = cdms.open("OBS/cru_ts4.01.1901.2016.pet.dat.REGRID.nc") pet = f("pet") f.close() landmask = pet[0].mask # Regridded GPCC fpr = cdms.open("OBS/precip.mon.total.2.5x2.5.v7.nc") pr = fpr("precip") fpr.close() pr = pr / 30. #Approximate mm-> mm/day by assuming 30 days/month #Put them both on the same time axis startpet = cmip5.start_time(pet) stoppet = cmip5.stop_time(pet) startpr = cmip5.start_time(pr) stoppr = cmip5.stop_time(pr) if cdtime.compare(startpet, startpr) > 0: start = startpet else: start = startpr if cdtime.compare(stoppet, stoppr) > 0: stop = stoppr else: stop = stoppet start = cdtime.comptime(start.year, start.month, 1) stop = cdtime.comptime(stop.year, stop.month, 31) pr = pr(time=(start, stop)) pet = pet(time=(start, stop)) #Calculate R and P Rpr, Ppr = sc.fast_annual_cycle(pr) Rpet, Ppet = sc.fast_annual_cycle(pet) #Convert phase to month of maximum (VECTORIZE THIS?) #How to handle "month of maximum" if it's fluctuating between 1 and 12? (physically, what does this mean when our timesteps are every year?) #Should we modify the code in phase detection to start at phase 0? Ie start in a month such that the maximum is 6 months away? #Calculate variance maps for p and pet test_period = ('1979-1-1', '2004-12-31' ) #for overlap with CMIP5 historical pet_vmap = sc.variance_map(pet(time=test_period)) pr_vmap = sc.variance_map(pr(time=test_period)) #make phase maps variance_threshold = 0.25 #Can we come up with a physically meaningful threshold here? Null hypothesis of no correlation ruled out at 99% confidence? Ppet_clim = sc.phase_climatology(Ppet) Ppet_clim_month = sc.mask_data(sc.phase_to_month(Ppet_clim), landmask) Ppr_clim = sc.phase_climatology(Ppr) Ppr_clim_month = sc.mask_data(sc.phase_to_month(Ppr_clim), landmask) months = [ "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" ] from land_seasonal_cycle import landplot plt.subplot(211) m = landplot(MV.masked_where(pet_vmap < variance_threshold, Ppet_clim_month), cmap=cm.hsv, vmin=0, vmax=12) m.drawcoastlines(color='gray') cbar = plt.colorbar(orientation="horizontal") cbar.set_ticks(np.arange(12)) cbar.set_ticklabels(months) plt.title("PET phase") plt.subplot(212) m = landplot(MV.masked_where(pr_vmap < variance_threshold, Ppr_clim_month), cmap=cm.hsv, vmin=0, vmax=12) m.drawcoastlines(color='gray') cbar = plt.colorbar(orientation="horizontal") cbar.set_ticks(np.arange(12)) cbar.set_ticklabels(months) plt.title("PR phase") #phase trends Pa_pet = sc.get_phase_anomalies(Ppet) Pa_pet_trends = cmip5.get_linear_trends(Pa_pet) Pa_pr = sc.get_phase_anomalies(Ppr) Pa_pr_trends = cmip5.get_linear_trends(Pa_pr)
def average_over_biome(K,X,biome): basicmask = K!=biome biome_mask = sc.mask_data(X,basicmask) return cdutil.averager(biome_mask,'xy')
def __init__(self, name, cutoff='0001-1-1'): if name.find("2.5") >= 0: self.name = name.split("2.5")[0] else: self.name = name #if name.find("+")<0: f = cdms.open("../DROUGHT_ATLAS/PROCESSED/" + name + ".nc") obs = f("pdsi") self.obs = MV.masked_where(np.isnan(obs), obs) self.obs = MV.masked_where(np.abs(self.obs) > 90, self.obs) self.obs = self.obs(time=(cutoff, '2020-12-31')) self.obs = mask_data( self.obs, self.obs.mask[0] ) #Make all the obs have the same mask as the first datapoint f.close() fm = cdms.open("../DROUGHT_ATLAS/CMIP5/pdsi." + name + ".hist.rcp85.nc") self.model = get_rid_of_bad(fm("pdsi")) self.model = MV.masked_where(np.isnan(self.model), self.model) fm.close() # else: #DEPRECATED: MERGE observations onto common grid using old code # name1,name2=name.split("+") # f1 = cdms.open("../DROUGHT_ATLAS/PROCESSED/"+name1+".nc") # obs1 = f1("pdsi") # obs1 = MV.masked_where(np.isnan(obs1),obs1) # obs1 = MV.masked_where(np.abs(obs1)>90,obs1) # obs1 = obs1(time=(cutoff,'2017-12-31')) # obs1=mask_data(obs1,obs1.mask[0]) # f1.close() # fm1 = cdms.open("../DROUGHT_ATLAS/CMIP5/pdsi."+name1+".hist.rcp85.nc") # model1=get_rid_of_bad(fm1("pdsi")) # model1=MV.masked_where(np.isnan(model1),model1) # fm1.close() # f2 = cdms.open("../DROUGHT_ATLAS/PROCESSED/"+name2+".nc") # obs2 = f2("pdsi") # obs2 = MV.masked_where(np.isnan(obs2),obs2) # obs2 = MV.masked_where(np.abs(obs2)>90,obs2) # obs2 = obs2(time=(cutoff,'2017-12-12')) # obs2=mask_data(obs2,obs2.mask[0]) # f2.close() # fm2 = cdms.open("../DROUGHT_ATLAS/CMIP5/pdsi."+name2+".hist.rcp85.nc") # model2=get_rid_of_bad(fm2("pdsi")) # model2=MV.masked_where(np.isnan(model2),model2) # fm2.close() # self.obs=merge.merge(obs1,obs2) # self.model=merge.merge(model1,model2) mma = MV.average(self.model, axis=0) self.mma = mask_data( mma, self.obs[0].mask) #make all the models have the same mask self.solver = Eof(self.mma, weights='area') self.eofmask = self.solver.eofs()[0].mask self.fac = da.get_orientation(self.solver) self.projection = self.solver.projectField( mask_data(self.obs, self.eofmask))[:, 0] * self.fac self.noise = self.projection(time=('1-1-1', '1850-1-1')) self.P = self.model_projections()