Пример #1
0
 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)
Пример #2
0
    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())
Пример #3
0
 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()
Пример #4
0
 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()
Пример #5
0
 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()
Пример #6
0
    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()
Пример #7
0
 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!')
Пример #8
0
    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())
Пример #9
0
    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!')
Пример #10
0
    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)
Пример #11
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,)