Пример #1
0
    def testErrors(self):
        crpss_dict = self.crpssDict()
        crpss_dict['variable'] = 'pr'
        crpss = Crpss(**crpss_dict)
        self.assertRaises(NoFilesFoundError, crpss.prepareInput)
        crpss_dict['variable'] = 'tas'
        crpss_dict['observation'] = 'merra'
        crpss = Crpss(**crpss_dict)
        self.assertRaises(NotEnoughYearsInFile, crpss.prepareInput)
        crpss_dict['observation'] = 'HadCrut'
        crpss_dict['project'] = 'cmip5'
        crpss_dict['experiment'] = 'hist*'
        crpss_dict['product1'] = 'output1'
        crpss = Crpss(**crpss_dict)
        self.assertRaises(NoFilesFoundError, crpss.prepareInput)

        crpss_dict = self.crpssDict()
        crpss_dict['ensemblemembers'] = 'r1i1p1'
        crpss = Crpss(**crpss_dict)
        crpss.prepareInput()
        self.assertRaises(NotEnoughEnsemblemembersFound, crpss.analyze)
Пример #2
0
 def testBootstrap(self):
     crpss_dict = self.crpssDict()
     crpss_dict['bootstrapSwitch'] = True
     crpss_dict['bootstrap_number'] = 5
     crpss = Crpss(**crpss_dict)
     crpss.prepareInput()
     crpss.analyze()
Пример #3
0
    def testCrpss(self):
        crpss_dict = self.crpssDict()
        crpss = Crpss(**crpss_dict)
        crpss.prepareInput()
        crpss.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])

            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())
Пример #4
0
 def testMaxLeadYearHistorical(self):
     crpss_dict = self.crpssDict()
     crpss_dict['decadals'] = range(1990,2000,5)
     crpss_dict['project'] = 'cmip5'
     crpss_dict['product1'] = 'output1'
     crpss_dict['leadtimes'] = '1,2'
     crpss_dict['experiment'] = 'historical'
     crpss = Crpss(**crpss_dict)
     crpss.prepareInput()
     crpss.analyze()
Пример #5
0
 def testEnsemblemembers(self):
      
     crpss_dict = self.crpssDict()
     crpss_dict['ensemblemembers'] = 'r2i1p1,r3i1p1'
     crpss = Crpss(**crpss_dict)
     crpss.prepareInput()
     crpss.analyze()
      
     for year in crpss_dict['decadals']:
         self.assertTrue(len(crpss.inputDict[year]) == 2, 'Too many ensemblemembers found!')
Пример #6
0
    def testErrors(self):
        crpss_dict = self.crpssDict()                 
        crpss_dict['variable'] = 'pr'
        crpss = Crpss(**crpss_dict)
        self.assertRaises(NoFilesFoundError, crpss.prepareInput)
        crpss_dict['variable'] = 'tas'    
        crpss_dict['observation'] = 'merra'
        crpss = Crpss(**crpss_dict)
        self.assertRaises(NotEnoughYearsInFile, crpss.prepareInput)
        crpss_dict['observation'] = 'HadCrut'
        crpss_dict['project'] = 'cmip5'
        crpss_dict['experiment'] = 'hist*'
        crpss_dict['product1'] = 'output1'
        crpss = Crpss(**crpss_dict)
        self.assertRaises(NoFilesFoundError, crpss.prepareInput)
 
        crpss_dict = self.crpssDict()
        crpss_dict['ensemblemembers'] = 'r1i1p1'
        crpss = Crpss(**crpss_dict)
        crpss.prepareInput()
        self.assertRaises(NotEnoughEnsemblemembersFound, crpss.analyze)
Пример #7
0
    def testTestfiles(self):
        
        def crps(var,H,O):
            x = (H-O)/var
            crps = -var * (1./np.sqrt(np.pi) - 2. * stats.norm.pdf(x) - x * (2. * stats.norm.cdf(x) - 1.))
            return crps
        
        def condBias(H,O):  
            H_ensmean = np.mean(H, axis=1)
            r = np.corrcoef(H_ensmean, O)[0,1]
            std_H = np.std(H_ensmean)
            std_O = np.std(O)            
            cond_bias = r * std_O/std_H
            return cond_bias
            
        from create_testfiles import createCrpssInput, getCrpssTimeseries
        mse_goal = 4
        ensspread_goal = 3
        ensemble_size = 10
        length = 20    
        #create timeseries
        (t,hind,obs) = getCrpssTimeseries(mse_goal, ensspread_goal, ensemble_size, length)    
        
        (hindcasts,observations) = createCrpssInput(1960, hind, obs, ensemble_size, length)
        
        crpssDict = self.crpssDict()
        crpssDict['decadals'] = hindcasts.keys()
        crpssDict['observation'] = 'HadCrut'
        crpssDict['leadtimes'] = '1'
        crpss = Crpss(**crpssDict)
        crpss.inputRemapped = hindcasts
        crpss.observationRemapped = observations
        crpss.analyze()
        
        factor = length/(length-2.)
        factor2 = ensemble_size/(ensemble_size-1.)

        ensspread = np.mean((factor2*np.var(hind,axis=1)))**0.5        
        hind_mean = np.mean(hind,axis=1)
        
        #calculte crossvalidated mean
        hind_mean_anom = hind_mean.copy()
        crossval = np.zeros((length))
        for i in range(length):
            tmp = np.delete(hind_mean,i)
            crossval[i] =  np.mean(tmp)
            hind_mean_anom[i] = hind_mean[i] - crossval[i]
        hind_mean = hind_mean_anom.copy()
        
        #remove conditional bias
        bias = condBias(hind, obs)
        for i in range(length):
            hind[i,:] = hind[i,:] - crossval[i]
            hind[i,:] = hind[i,:] + (bias-1)*hind_mean[i]
        hind_mean_corrected = np.mean(hind,axis=1)
        RMSE = (factor*np.mean((np.mean(hind,axis=1)-obs)**2))**0.5
        
        #calculate crpss_goal
        crps1 = np.zeros((length))
        crps2 = np.zeros((length))
        for i in range(length):
            crps1[i] = crps(ensspread, hind_mean_corrected[i], obs[i])
            crps2[i] = crps(RMSE,hind_mean_corrected[i],obs[i]) 
        crpss_goal = 1 - np.mean(crps1)/np.mean(crps2)
        
        #test spreadscore
        tf = crpss.outputDir+'1-1/baseline1_output_mpi-esm-lr_decs4e_input1/ensemble_spread/1_1_tas_baseline1_output_mpi-esm-lr_decs4e_1960-1979_ensspread_vs_referror.nc'
        t1 = FileHandler.openNetCDFFile(tf,mode='var')
        self.assertAlmostEqual(t1[12,12],ensspread/RMSE,2)

        #test crpss ens vs ref
        tf = crpss.outputDir+'1-1/baseline1_output_mpi-esm-lr_decs4e_input1/ensemble_spread/1_1_tas_baseline1_output_mpi-esm-lr_decs4e_1960-1979_ens-vs-ref_crpss.nc'
        t1 = FileHandler.openNetCDFFile(tf,mode='var')
        self.assertAlmostEqual(t1[12,12],crpss_goal,2)
Пример #8
0
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,)