Esempio n. 1
0
    def test_portrait(self):
        try:
            import vcs
        except:
            raise RuntimeError(
                "Sorry your python is not build with VCS support cannot geenrate portrait plots")

        import json
        # CDAT MODULES
        import pcmdi_metrics
        import pcmdi_metrics.graphics.portraits
        import MV2
        import numpy
        from genutil import statistics
        import os
        import sys
        import glob

        # CREATES VCS OBJECT AS A PORTAIT PLOT AND LOADS PLOT SETTINGS FOR
        # EXAMPLE
        x = vcs.init()
        x.portrait()
        # Turn off antialiasing for test suite
        x.setantialiasing(0)

        # PARAMETERS STUFF
        P = pcmdi_metrics.graphics.portraits.Portrait()

        # Turn off verbosity
        P.verbose = False

        P.PLOT_SETTINGS.levels = [-1.e20, -.5, -.4, -.3, -.2, -.1,
                                  0., .1, .2, .3, .4, .5, 1.e20]

        P.PLOT_SETTINGS.x1 = .1
        P.PLOT_SETTINGS.x2 = .85
        P.PLOT_SETTINGS.y1 = .12
        P.PLOT_SETTINGS.y2 = .95

        P.PLOT_SETTINGS.xtic2y1 = P.PLOT_SETTINGS.y1
        P.PLOT_SETTINGS.xtic2y2 = P.PLOT_SETTINGS.y2
        P.PLOT_SETTINGS.ytic2x1 = P.PLOT_SETTINGS.x1
        P.PLOT_SETTINGS.ytic2x2 = P.PLOT_SETTINGS.x2

        # P.PLOT_SETTINGS.missing_color = 3
        # P.PLOT_SETTINGS.logo = None
        P.PLOT_SETTINGS.time_stamp = None
        P.PLOT_SETTINGS.draw_mesh = 'n'
        # P.PLOT_SETTINGS.tictable.font = 3

        x.scriptrun(
            os.path.join(
                pcmdi_metrics.__path__[0],
                "..",
                "..",
                "..",
                "..",
                "share",
                "graphics",
                'vcs',
                'portraits.scr'))
        P.PLOT_SETTINGS.colormap = 'bl_rd_12'
        # cols=vcs.getcolors(P.PLOT_SETTINGS.levels,range(16,40),split=1)
        cols = vcs.getcolors(P.PLOT_SETTINGS.levels, range(144, 156), split=1)
        P.PLOT_SETTINGS.fillareacolors = cols

        P.PLOT_SETTINGS.parametertable.expansion = 100

        # LIST OF VARIABLES TO BE USED IN PORTRAIT PLOT
        vars = [
            'pr',
            'rsut',
            'rsutcs',
            'rlutcs',
            'tas',
            'tos',
            'sos',
            'zos',
            'ua-850',
            'ua-200',
            'zg-500']
        vars = []

        # LOAD METRICS DICTIONARIES FROM JSON FILES FOR EACH VAR AND STORE AS A
        # SINGLE DICTIONARY
        var_cmip5_dics = {}
        mods = set()
        json_files = glob.glob(
            os.path.join(
                pcmdi_metrics.__path__[0],
                "..",
                "..",
                "..",
                "..",
                "share",
                "CMIP_metrics_results",
                "CMIP5",
                "amip",
                "*.json"))

        for fnm in json_files:
            f = open(fnm)
            d = json.load(f)
            var = os.path.basename(fnm).split("_")[0]
            vars.append(var)
            for m in d.keys():
                mods.add(m)
            if var in var_cmip5_dics:
                var_cmip5_dics[var].update(d)
            else:
                var_cmip5_dics[var] = d

        vars.sort()
        mods = sorted(list(mods))
        print "Models:",mods
        for bad in ["GridInfo", "References", "RegionalMasking",
                    "metrics_git_sha1", "uvcdat_version"]:
            if bad in mods:
                mods.remove(bad)
            else:
                print "Not removing column %s (not present)" % bad

        # ORGANIZE METRICS INTO A VARIABLES X MODELS MATRIX

        out1_rel = MV2.zeros(
            (len(vars),
             len(mods)),
            MV2.float32)  # DEFINE ARRAY

        vn = -1  # VARIABLE INDEX
        for var in vars:  # LOOP OVER VARIABLE
            vn = vn + 1

            vals = []
            for mod in mods:  # LOOP OVER MODEL
                try:
                    rms = var_cmip5_dics[var][mod]["defaultReference"][
                        "r1i1p1"]["global"]['rms_xyt_ann_GLB']
                    if P.verbose:
                        print var, ' ', mod, '  ', repr(rms), ' WITH global'
                except:
                    rms = 1.e20
                    if P.verbose:
                        print var, ' ', mod, '  ', repr(rms), ' missing'

                rms = float(rms)
                vals.append(rms)

            vars_ar = MV2.array(vals)
            # COMPUTE MEDIAN RESULT FOR PORTRAIT NORMALIZATION
            med_rms = statistics.median(vars_ar)[0]

            mn = -1  # MODEL INDEX
            for mod in mods:
                mn = mn + 1
                try:
                    out1_rel[vn, mn] = (float(var_cmip5_dics[var][mod]["defaultReference"][
                                        "r1i1p1"]["global"]['rms_xyt_ann_GLB']) - med_rms) / med_rms  # RELATIVE ERROR
                except:
                    out1_rel[vn, mn] = numpy.ma.masked

        # ADD SPACES FOR LABELS TO ALIGN AXIS LABELS WITH PLOT
        modsAxis = mods
        varsAxis = vars

        # LOOP THROUGH LISTS TO ADD SPACES
        for i in range(len(modsAxis)):
            modsAxis[i] = modsAxis[i] + '  '
        for i in range(len(varsAxis)):
            varsAxis[i] = varsAxis[i] + '  '

        yax = [s.encode('utf-8')
               for s in mods]  # CHANGE FROM UNICODE TO BYTE STRINGS
        xax = vars

        # GENERATE PLOT
        P.decorate(out1_rel, xax, yax)
        # P.plot(out1_rel,x=x,multiple=1.1,bg=0)  # FOR PLOTTING TRIANGLES WHEN
        # USING TWO OR MORE REFERENCE DATA SETS
        P.plot(out1_rel, bg=1, x=x)
        # x.backend.renWin.Render()

        # END OF PLOTTING

        # SAVE PLOT
        src = os.path.join(os.path.dirname(__file__), "testPortrait.png")
        print src
        fnm = os.path.join(os.getcwd(), "testPortrait.png")
        x.png(fnm)
        ret = checkimage.check_result_image(
            fnm,
            src,
            checkimage.defaultThreshold)
        if ret != 0:
            sys.exit(ret)
            if P.verbose:
                print var, ' ', mod, '  ', repr(rms1), ' missing'

        rms1 = float(rms1)
        vals1.append(rms1)
        rms2 = float(rms2)
        vals2.append(rms2)
        rms3 = float(rms3)
        vals3.append(rms3)
        rms4 = float(rms4)
        vals4.append(rms4)

    vars_ar1 = MV2.array(vals1)
    # COMPUTE MEDIAN RESULT FOR PORTRAIT NORMALIZATION
    med_rms1 = statistics.median(vars_ar1)[0]
    vars_ar2 = MV2.array(vals2)
    med_rms2 = statistics.median(vars_ar2)[0]
    vars_ar3 = MV2.array(vals3)
    med_rms3 = statistics.median(vars_ar3)[0]
    vars_ar4 = MV2.array(vals4)
    med_rms4 = statistics.median(vars_ar4)[0]

    mn = -1  # MODEL INDEX
    for mod in mods:
        mn = mn + 1
        try:
            out1_rel[vn, mn] = (float(var_cmip5_dics[var][mod]["defaultReference"][
                                "r1i1p1"]["global"]['rms_xy_djf_GLB']) - med_rms1) / med_rms1  # RELATIVE ERROR
            out2_rel[vn, mn] = (float(var_cmip5_dics[var][mod]["defaultReference"][
                                "r1i1p1"]["global"]['rms_xy_mam_GLB']) - med_rms2) / med_rms2  # RELATIVE ERROR
Esempio n. 3
0
   vals = []
   for mod in mods: # LOOP OVER MODEL
    try:
       rms = var_cmip5_dics[var][mod]["default"]["r1i1p1"]['rms_xyt_ann_GLB']
       if P.verbose:
           print var,' ', mod,'  ', `rms`, ' WITH global'
    except:    
       rms = 1.e20
       if P.verbose:
           print var,' ', mod,'  ', `rms`, ' missing'

    rms = float(rms)
    vals.append(rms)

   vars_ar = MV2.array(vals)
   med_rms = statistics.median(vars_ar)[0]  # COMPUTE MEDIAN RESULT FOR PORTRAIT NORMALIZATION 

   mn = -1 # MODEL INDEX
   for mod in mods: 
     mn = mn + 1
     try:
       out1_rel[vn,mn] = (float(var_cmip5_dics[var][mod]["default"]["r1i1p1"]['rms_xyt_ann_GLB'])-med_rms)/med_rms # RELATIVE ERROR 
     except:
       out1_rel[vn,mn] = 1.e20 

# ADD SPACES FOR LABELS TO ALIGN AXIS LABELS WITH PLOT
modsAxis = mods
varsAxis = vars

# LOOP THROUGH LISTS TO ADD SPACES
for i in range(len(modsAxis)):
       rms4 = 1.e20

       if P.verbose:
           print var,' ', mod,'  ', `rms1`, ' missing'

    rms1 = float(rms1)
    vals1.append(rms1)
    rms2 = float(rms2)
    vals2.append(rms2)
    rms3 = float(rms3)
    vals3.append(rms3)
    rms4 = float(rms4)
    vals4.append(rms4)

   vars_ar1 = MV2.array(vals1)
   med_rms1 = statistics.median(vars_ar1)[0]  # COMPUTE MEDIAN RESULT FOR PORTRAIT NORMALIZATION 
   vars_ar2 = MV2.array(vals2)
   med_rms2 = statistics.median(vars_ar2)[0]  
   vars_ar3 = MV2.array(vals3)
   med_rms3 = statistics.median(vars_ar3)[0]  
   vars_ar4 = MV2.array(vals4)
   med_rms4 = statistics.median(vars_ar4)[0]  


   mn = -1 # MODEL INDEX
   for mod in mods: 
     mn = mn + 1
     try:
       out1_rel[vn,mn] = (float(var_cmip5_dics[var][mod]["defaultReference"]["r1i1p1"]["global"]['rms_xy_djf_GLB'])-med_rms1)/med_rms1 # RELATIVE ERROR 
       out2_rel[vn,mn] = (float(var_cmip5_dics[var][mod]["defaultReference"]["r1i1p1"]["global"]['rms_xy_mam_GLB'])-med_rms2)/med_rms2 # RELATIVE ERROR 
       out3_rel[vn,mn] = (float(var_cmip5_dics[var][mod]["defaultReference"]["r1i1p1"]["global"]['rms_xy_jja_GLB'])-med_rms3)/med_rms3 # RELATIVE ERROR 
Esempio n. 5
0
    for mod in mods:  # LOOP OVER MODEL
        try:
            rms = var_cmip5_dics[var][mod]["default"]["r1i1p1"][
                'rms_xyt_ann_GLB']
            if P.verbose:
                print var, ' ', mod, '  ', ` rms `, ' WITH global'
        except:
            rms = 1.e20
            if P.verbose:
                print var, ' ', mod, '  ', ` rms `, ' missing'

        rms = float(rms)
        vals.append(rms)

    vars_ar = MV2.array(vals)
    med_rms = statistics.median(vars_ar)[
        0]  # COMPUTE MEDIAN RESULT FOR PORTRAIT NORMALIZATION

    mn = -1  # MODEL INDEX
    for mod in mods:
        mn = mn + 1
        try:
            out1_rel[vn, mn] = (float(var_cmip5_dics[var][mod]["default"]
                                      ["r1i1p1"]['rms_xyt_ann_GLB']) -
                                med_rms) / med_rms  # RELATIVE ERROR
        except:
            out1_rel[vn, mn] = 1.e20

# ADD SPACES FOR LABELS TO ALIGN AXIS LABELS WITH PLOT
modsAxis = mods
varsAxis = vars
Esempio n. 6
0
    def test_portrait(self):
        try:
            import vcs
        except:
            raise RuntimeError(
                "Sorry your python is not build with VCS support cannot geenrate portrait plots")

        import json
        # CDAT MODULES
        import pcmdi_metrics
        import pcmdi_metrics.graphics.portraits
        import MV2
        import numpy
        from genutil import statistics
        import os
        import sys
        import glob

        print
        print
        print
        print
        print "---------------------------------------------------"
        print "RUNNING: Portrait test"
        print "---------------------------------------------------"
        print
        print
        print
        print
        # CREATES VCS OBJECT AS A PORTAIT PLOT AND LOADS PLOT SETTINGS FOR
        # EXAMPLE
        x = vcs.init()
        x.portrait()
        # Turn off antialiasing for test suite
        x.setantialiasing(0)

        # PARAMETERS STUFF
        P = pcmdi_metrics.graphics.portraits.Portrait()

        # Turn off verbosity
        P.verbose = False

        P.PLOT_SETTINGS.levels = [-1.e20, -.5, -.4, -.3, -.2, -.1,
                                  0., .1, .2, .3, .4, .5, 1.e20]

        P.PLOT_SETTINGS.x1 = .1
        P.PLOT_SETTINGS.x2 = .85
        P.PLOT_SETTINGS.y1 = .12
        P.PLOT_SETTINGS.y2 = .95

        P.PLOT_SETTINGS.xtic2y1 = P.PLOT_SETTINGS.y1
        P.PLOT_SETTINGS.xtic2y2 = P.PLOT_SETTINGS.y2
        P.PLOT_SETTINGS.ytic2x1 = P.PLOT_SETTINGS.x1
        P.PLOT_SETTINGS.ytic2x2 = P.PLOT_SETTINGS.x2

        # P.PLOT_SETTINGS.missing_color = 3
        # P.PLOT_SETTINGS.logo = None
        P.PLOT_SETTINGS.time_stamp = None
        P.PLOT_SETTINGS.draw_mesh = 'n'
        # P.PLOT_SETTINGS.tictable.font = 3

        x.scriptrun(
            os.path.join(
                sys.prefix,
                "share",
                "pmp",
                "graphics",
                'vcs',
                'portraits.scr'))
        P.PLOT_SETTINGS.colormap = 'bl_rd_12'
        # cols=vcs.getcolors(P.PLOT_SETTINGS.levels,range(16,40),split=1)
        cols = vcs.getcolors(P.PLOT_SETTINGS.levels, range(144, 156), split=1)
        P.PLOT_SETTINGS.fillareacolors = cols

        P.PLOT_SETTINGS.parametertable.expansion = 100

        # LIST OF VARIABLES TO BE USED IN PORTRAIT PLOT
        vars = [
            'pr',
            'rsut',
            'rsutcs',
            'rlutcs',
            'tas',
            'tos',
            'sos',
            'zos',
            'ua-850',
            'ua-200',
            'zg-500']
        vars = []

        # LOAD METRICS DICTIONARIES FROM JSON FILES FOR EACH VAR AND STORE AS A
        # SINGLE DICTIONARY
        var_cmip5_dics = {}
        mods = set()
        json_files = glob.glob(
            os.path.join(
                os.path.dirname(__file__),
                "json",
                "*.json"))

        for fnm in json_files:
            f = open(fnm)
            d = json.load(f)
            var = os.path.basename(fnm).split("_")[0]
            vars.append(var)
            for m in d.keys():
                mods.add(m)
            if var in var_cmip5_dics:
                var_cmip5_dics[var].update(d)
            else:
                var_cmip5_dics[var] = d

        vars.sort()
        mods = sorted(list(mods))
        print "Models:", mods
        for bad in ["GridInfo", "References", "RegionalMasking",
                    "metrics_git_sha1", "uvcdat_version"]:
            if bad in mods:
                mods.remove(bad)
            else:
                print "Not removing column %s (not present)" % bad

        # ORGANIZE METRICS INTO A VARIABLES X MODELS MATRIX

        out1_rel = MV2.zeros(
            (len(vars),
             len(mods)),
            MV2.float32)  # DEFINE ARRAY

        vn = -1  # VARIABLE INDEX
        for var in vars:  # LOOP OVER VARIABLE
            vn = vn + 1

            vals = []
            for mod in mods:  # LOOP OVER MODEL
                try:
                    rms = var_cmip5_dics[var][mod]["defaultReference"][
                        "r1i1p1"]["global"]['rms_xyt_ann_GLB']
                    if P.verbose:
                        print var, ' ', mod, '  ', repr(rms), ' WITH global'
                except:
                    rms = 1.e20
                    if P.verbose:
                        print var, ' ', mod, '  ', repr(rms), ' missing'

                rms = float(rms)
                vals.append(rms)

            vars_ar = MV2.array(vals)
            # COMPUTE MEDIAN RESULT FOR PORTRAIT NORMALIZATION
            med_rms = statistics.median(vars_ar)[0]

            mn = -1  # MODEL INDEX
            for mod in mods:
                mn = mn + 1
                try:
                    out1_rel[vn, mn] = (float(var_cmip5_dics[var][mod]["defaultReference"][
                                        "r1i1p1"]["global"]['rms_xyt_ann_GLB']) - med_rms) / med_rms  # RELATIVE ERROR
                except:
                    out1_rel[vn, mn] = numpy.ma.masked

        # ADD SPACES FOR LABELS TO ALIGN AXIS LABELS WITH PLOT
        modsAxis = mods
        varsAxis = vars

        # LOOP THROUGH LISTS TO ADD SPACES
        for i in range(len(modsAxis)):
            modsAxis[i] = modsAxis[i] + '  '
        for i in range(len(varsAxis)):
            varsAxis[i] = varsAxis[i] + '  '

        yax = [s.encode('utf-8')
               for s in mods]  # CHANGE FROM UNICODE TO BYTE STRINGS
        xax = vars

        # GENERATE PLOT
        P.decorate(out1_rel, xax, yax)
        # P.plot(out1_rel,x=x,multiple=1.1,bg=0)  # FOR PLOTTING TRIANGLES WHEN
        # USING TWO OR MORE REFERENCE DATA SETS
        P.plot(out1_rel, bg=1, x=x)
        # x.backend.renWin.Render()

        # END OF PLOTTING

        # SAVE PLOT
        src = os.path.join(os.path.dirname(__file__), "testPortrait.png")
        print src
        fnm = os.path.join(os.getcwd(), "testPortrait.png")
        x.png(fnm)
        ret = checkimage.check_result_image(
            fnm,
            src,
            checkimage.defaultThreshold)
        if ret != 0:
            sys.exit(ret)