def testMsss(self): msssDict = self.msssDict() msss = Msss(**msssDict) msss.prepareInput() msss.analyze() #test file names res_files = [f for r,_,files in os.walk(self.tmp_dir+'/output') for f in files] test_files = [f for r,_,files in os.walk(self.test_path+'/output') for f in files] self.assertEqual(sorted(res_files),sorted(test_files)) res_files = [f for r,_,files in os.walk(self.tmp_dir+'/plots') for f in files] test_files = [f for r,_,files in os.walk(self.test_path+'/plots') for f in files] self.assertEqual(sorted(res_files),sorted(test_files)) #test values of all .nc files res_files = sorted([os.path.join(r,f) for r,_,files in os.walk(self.tmp_dir+'/output') for f in files]) test_files = sorted([os.path.join(r,f) for r,_,files in os.walk(self.test_path+'/output') for f in files]) for i,f in enumerate(res_files): t1 = FileHandler.openNetCDFFile(res_files[i]) t2 = FileHandler.openNetCDFFile(test_files[i]) # print res_files[i] # print test_files[i] np.testing.assert_array_almost_equal(t1['variable'], t2['variable'], 3) #elf.assertTrue((t1['variable']==t2['variable']).all()) self.assertTrue((t1['lon']==t2['lon']).all()) self.assertTrue((t1['lat']==t2['lat']).all())
def testMaxLeadYearHistorical(self): msssDict = self.msssDict() msssDict['decadals'] = range(1990,2000,5) msssDict['project2'] = 'cmip5' msssDict['leadtimes'] = '1,2' msssDict['experiment2'] = 'historical' msss = Msss(**msssDict) msss.prepareInput() msss.analyze()
def testSameModels(self): msssDict = self.msssDict() msssDict['project2'] = msssDict['project1'] msssDict['product2'] = msssDict['product1'] msssDict['experiment2'] = msssDict['experiment1'] msssDict['experiment2'] = msssDict['experiment1'] msss = Msss(**msssDict) msss.prepareInput() msss.analyze()
def testEnsemblemembers(self): msssDict = self.msssDict() msssDict['ensemblemembers1'] = 'r1i1p1' msssDict['ensemblemembers2'] = 'r2i1p1,r3i1p1' msss = Msss(**msssDict) msss.prepareInput() msss.analyze() for year in msssDict['decadals']: self.assertTrue(len(msss.ensList[year]) == 1, 'Too many ensemblemembers found!') self.assertTrue(len(msss.histList[year]) == 2, 'Too many ensemblemembers found!')
def testErrors(self): msss_dict = self.msssDict() msss_dict['variable'] = 'pr' msss = Msss(**msss_dict) self.assertRaises(NoFilesFoundError, msss.prepareInput) msss_dict['variable'] = 'tas' msss_dict['observation'] = 'merra' msss = Msss(**msss_dict) self.assertRaises(NotEnoughYearsInFile, msss.prepareInput) msss_dict['observation'] = 'HadCrut' msss_dict['project2'] = 'cmip5' msss_dict['experiment2'] = 'hist*' msss = Msss(**msss_dict) self.assertRaises(NoFilesFoundError, msss.prepareInput)
def testTestfiles(self): from create_testfiles import createMsssInput std1_goal=1. std2_goal=2. corr_goal=0.5 std_ratio = std2_goal/std1_goal cond_bias = corr_goal - std1_goal/std2_goal msss_goal = corr_goal**2 + cond_bias**2 length = 50 (hindcasts,observations) = createMsssInput(1960, std1_goal, std2_goal, corr_goal, length) msssDict = self.msssDict() msssDict['decadals'] = hindcasts.keys() msssDict['observation'] = 'hadcrut3v' msssDict['leadtimes'] = '1' msss = Msss(**msssDict) msss.input1Remapped = hindcasts msss.input2Remapped = hindcasts msss.observationRemapped = observations msss.analyze() goal_dict = {'msss_goal': '1-1/baseline1_output_mpi-esm-lr_decs4e_input1/accuracy/1_1_tas_baseline1_output_mpi-esm-lr_decs4e_1960-2009_msss.nc', 'corr_goal': '1-1/baseline1_output_mpi-esm-lr_decs4e_input1/accuracy/1_1_tas_baseline1_output_mpi-esm-lr_decs4e_1960-2009_correlation.nc', 'cond_bias': '1-1/baseline1_output_mpi-esm-lr_decs4e_input1/accuracy/1_1_tas_baseline1_output_mpi-esm-lr_decs4e_1960-2009_conditional_bias.nc', 'std_ratio': '1-1/baseline1_output_mpi-esm-lr_decs4e_input1/accuracy/1_1_tas_baseline1_output_mpi-esm-lr_decs4e_1960-2009_std_ratio.nc'} for key,val in goal_dict.iteritems(): t1 = FileHandler.openNetCDFFile(msss.outputDir+val,mode='var') self.assertAlmostEqual(np.round(t1[12,12],2), locals()[key], 1)
def testMaxLeadYearHistorical(self): msssDict = self.msssDict() msssDict['decadals'] = range(1990, 2000, 5) msssDict['project2'] = 'cmip5' msssDict['leadtimes'] = '1,2' msssDict['experiment2'] = 'historical' msss = Msss(**msssDict) msss.prepareInput() msss.analyze()
def testMsss(self): msssDict = self.msssDict() msss = Msss(**msssDict) msss.prepareInput() msss.analyze() #test file names res_files = [ f for r, _, files in os.walk(self.tmp_dir + '/output') for f in files ] test_files = [ f for r, _, files in os.walk(self.test_path + '/output') for f in files ] self.assertEqual(sorted(res_files), sorted(test_files)) res_files = [ f for r, _, files in os.walk(self.tmp_dir + '/plots') for f in files ] test_files = [ f for r, _, files in os.walk(self.test_path + '/plots') for f in files ] self.assertEqual(sorted(res_files), sorted(test_files)) #test values of all .nc files res_files = sorted([ os.path.join(r, f) for r, _, files in os.walk(self.tmp_dir + '/output') for f in files ]) test_files = sorted([ os.path.join(r, f) for r, _, files in os.walk(self.test_path + '/output') for f in files ]) #test_files = sorted([os.path.join(r,f) for r,_,files in os.walk(tets_p) for f in files]) # print len(res_files) # print len(test_files) for i, f in enumerate(res_files): tmp_test = cdo.copy(input=test_files[i], options='-f nc') t1 = FileHandler.openNetCDFFile(res_files[i]) t2 = FileHandler.openNetCDFFile(tmp_test) #test_files[i]) # print '_______________________________________-' # print res_files[i] # print test_files[i] np.testing.assert_array_almost_equal(t1['variable'], t2['variable'], 0) self.assertTrue((t1['lon'] == t2['lon']).all()) self.assertTrue((t1['lat'] == t2['lat']).all())
def testTestfiles(self): from create_testfiles import createMsssInput std1_goal = 1. std2_goal = 2. corr_goal = 0.5 std_ratio = std2_goal / std1_goal cond_bias = corr_goal - std1_goal / std2_goal msss_goal = corr_goal**2 + cond_bias**2 length = 50 (hindcasts, observations) = createMsssInput(1960, std1_goal, std2_goal, corr_goal, length) msssDict = self.msssDict() msssDict['decadals'] = hindcasts.keys() msssDict['observation'] = 'hadcrut3v' msssDict['leadtimes'] = '1' msss = Msss(**msssDict) msss.input1Remapped = hindcasts msss.input2Remapped = hindcasts msss.observationRemapped = observations msss.analyze() goal_dict = { 'msss_goal': '1-1/baseline1_output_mpi-esm-lr_decs4e/msss/1_1_tas_baseline1_output_mpi-esm-lr_decs4e_1960-2009_msss.nc', 'corr_goal': '1-1/baseline1_output_mpi-esm-lr_decs4e/msss/1_1_tas_baseline1_output_mpi-esm-lr_decs4e_1960-2009_correlation.nc', 'cond_bias': '1-1/baseline1_output_mpi-esm-lr_decs4e/msss/1_1_tas_baseline1_output_mpi-esm-lr_decs4e_1960-2009_conditional_bias.nc', 'std_ratio': '1-1/baseline1_output_mpi-esm-lr_decs4e/msss/1_1_tas_baseline1_output_mpi-esm-lr_decs4e_1960-2009_std_ratio.nc' } for key, val in goal_dict.iteritems(): t1 = FileHandler.openNetCDFFile(msss.outputDir + val, mode='var') print key print locals()[key] print t1[12, 12] self.assertAlmostEqual(np.round(t1[12, 12], 2), locals()[key], 2)
def testEnsemblemembers(self): msssDict = self.msssDict() msssDict['ensemblemembers1'] = 'r1i1p1' msssDict['ensemblemembers2'] = 'r2i1p1,r3i1p1' msss = Msss(**msssDict) msss.prepareInput() msss.analyze() for year in msssDict['decadals']: self.assertTrue( len(msss.ensList[year]) == 1, 'Too many ensemblemembers found!') self.assertTrue( len(msss.histList[year]) == 2, 'Too many ensemblemembers found!')
def main(argv=None): # IGNORE:C0111 '''Command line options.''' if argv is None: argv = sys.argv[1:] args, lastargs = getopt.getopt(argv, _short_args, _args) for flag,arg in args: if flag=='-h' or flag=='--help': return printHelp() murcss_dict = getMurcssDict() for arg in lastargs: if '=' not in arg: raise CommandError("Invalid format for query: %s" % arg) items = arg.split('=') key, value = items[0], ''.join(items[1:]) murcss_dict[key] = value murcss_dict['decadals'] = map(int,murcss_dict['decadals'].split(',')) murcss_dict['bootstrap_number'] = int(murcss_dict['bootstrap_number']) analysis_type = murcss_dict.pop('analysis_type') if analysis_type == 'map': murcss_dict['fieldmean'] = False murcss_dict['zonalmean'] = False elif analysis_type == 'fieldmean': murcss_dict['fieldmean'] = True murcss_dict['zonalmean'] = False elif analysis_type == 'zonalmean': murcss_dict['fieldmean'] = False murcss_dict['zonalmean'] = True output_type = murcss_dict.pop('output_type') if output_type == 'basic': murcss_dict['basic_output'] = True else: murcss_dict['basic_output'] = False #Check for right metics value metrics = murcss_dict.pop('metrics') if metrics not in ['all','accuracy','ensemble_spread']: raise Exception, '%s is not a valid option. Only valid options for metric are: "all", "ensemble_spread", and "accuracy".' % (metrics) if metrics in ['all','accuracy']: print '#######################' print 'Calculating the MSSS' print '#######################' #Calculation of MSESS if(not murcss_dict['significance']): msss_dict = murcss_dict.copy() msss_dict.pop('bootstrap_number') msss_dict.pop('significance') msss = Msss(**msss_dict) msss.prepareInput() msss.analyze() msss.deleteCache() else: from metrics.msssBootstrap import main msss = main(murcss_dict.copy(),'..') if metrics in ['all','ensemble_spread']: print '#######################' print 'Calculating the CRPSS for Model1' print '#######################' crpss1 = Crpss(output=murcss_dict['output'], output_plots=murcss_dict['output_plots'], basic_output=murcss_dict['basic_output'], decadals=murcss_dict['decadals'], variable=murcss_dict['variable'], project = murcss_dict['project1'], product1=murcss_dict['product1'], institute1=murcss_dict['institute1'], model=murcss_dict['model1'], experiment=murcss_dict['experiment1'], ensemblemembers=murcss_dict['ensemblemembers1'], observation = murcss_dict['observation'], leadtimes=murcss_dict['leadtimes'], result_grid=murcss_dict['result_grid'], maskMissingValues=murcss_dict['maskMissingValues'], bootstrapSwitch=murcss_dict['significance'], bootstrap_number=murcss_dict['bootstrap_number'], level=murcss_dict['level'], lonlatbox=murcss_dict['lonlatbox'], fieldmean=murcss_dict['fieldmean'], zonalmean=murcss_dict['zonalmean'], cache=murcss_dict['cache'], baseDir = murcss_dict['baseDir']) if metrics != 'ensemble_spread': crpss1.outputDir = msss.outputDir crpss1.outputPlots = msss.outputPlots crpss1.prepareInput() crpss1.analyze() crpss1.deleteCache() print '#######################' print 'Calculating the CRPSS for Model2' print '#######################' crpss2 = Crpss(output=murcss_dict['output'], output_plots=murcss_dict['output_plots'], basic_output=murcss_dict['basic_output'], decadals=murcss_dict['decadals'], variable=murcss_dict['variable'], project = murcss_dict['project2'], product1=murcss_dict['product2'], institute1=murcss_dict['institute2'], model=murcss_dict['model2'], experiment=murcss_dict['experiment2'], ensemblemembers=murcss_dict['ensemblemembers2'], observation = murcss_dict['observation'], leadtimes=murcss_dict['leadtimes'], result_grid=murcss_dict['result_grid'], maskMissingValues=murcss_dict['maskMissingValues'], bootstrapSwitch=murcss_dict['significance'], bootstrap_number=murcss_dict['bootstrap_number'], level=murcss_dict['level'], lonlatbox=murcss_dict['lonlatbox'], fieldmean=murcss_dict['fieldmean'], zonalmean=murcss_dict['zonalmean'], cache=murcss_dict['cache'], input_part='input2', baseDir = murcss_dict['baseDir']) if metrics != 'ensemble_spread': crpss2.outputDir = msss.outputDir crpss2.outputPlots = msss.outputPlots crpss2.prepareInput() crpss2.analyze() crpss2.deleteCache() import metrics.msss, metrics.metricAbstract, metrics.filehandler, metrics.taylorplot, metrics.crpss, metrics.msssBootstrap del metrics.msss.cdo, metrics.metricAbstract.cdo, metrics.filehandler.cdo, metrics.taylorplot.cdo, metrics.crpss.cdo, metrics.msssBootstrap.cdo print 'Calculation finished.' print 'Plots produced in %s' %(msss.outputPlots,)