コード例 #1
0
    def confront(self, m):

        obs, mod = self.stageData(m)
        obs_area = obs.integrateInSpace().convert("1e6 km2")
        mod_area = mod.integrateInSpace().convert("1e6 km2")

        # Interpolate to a composed grid
        lat, lon, lat_bnds, lon_bnds = il._composeGrids(obs, mod)
        OBS = obs.interpolate(lat=lat,
                              lon=lon,
                              lat_bnds=lat_bnds,
                              lon_bnds=lon_bnds)
        MOD = mod.interpolate(lat=lat,
                              lon=lon,
                              lat_bnds=lat_bnds,
                              lon_bnds=lon_bnds)

        # Compute the different extent areas
        o_mask = OBS.data.mask
        o_land = (OBS.area > 1e-12) * (o_mask == 0)
        o_data = np.copy(OBS.data.data)
        o_data[np.where(OBS.data.mask)] = 0.

        m_mask = MOD.data.mask
        m_land = (MOD.area > 1e-12)
        m_data = np.copy(MOD.data.data)
        m_data[np.where(MOD.data.mask)] = 0.

        o_and_m = (np.abs(o_data - 1) < 1e-12) * (np.abs(m_data - 1) < 1e-12)
        o_not_m_land = (np.abs(o_data - 1) < 1e-12) * (np.abs(m_data) <
                                                       1e-12) * (m_land == 0)
        o_not_m_miss = (np.abs(o_data - 1) < 1e-12) * (np.abs(m_data) <
                                                       1e-12) * (m_land == 1)
        o_zones = 1. * o_and_m
        o_zones += 2. * o_not_m_land
        o_zones += 4. * o_not_m_miss
        o_zones = np.ma.masked_array(o_zones, mask=o_mask)

        m_and_o = (np.abs(m_data - 1) < 1e-12) * (np.abs(o_data - 1) < 1e-12)
        m_not_o_land = (np.abs(m_data - 1) < 1e-12) * (np.abs(o_data) <
                                                       1e-12) * (o_land == 0)
        m_not_o_miss = (np.abs(m_data - 1) < 1e-12) * (np.abs(o_data) <
                                                       1e-12) * (o_land == 1)
        m_zones = 1. * m_and_o
        m_zones += 2. * m_not_o_land
        m_zones += 4. * m_not_o_miss
        m_zones = np.ma.masked_array(m_zones, mask=m_mask)

        zones = 1. * o_and_m
        zones += 2. * o_not_m_miss
        zones += 4. * m_not_o_miss
        zones += 8. * m_not_o_land
        zones = np.ma.masked_less(zones, 1)
        for i, u in enumerate(np.unique(zones.compressed())):
            zones[np.where(zones == u)] = i

        # compute the intersection of obs and mod
        obs_and_mod = Variable(name="obs_and_mod",
                               unit="1",
                               data=np.ma.masked_values(zones == 0,
                                                        0).astype(float),
                               lat=lat,
                               lon=lon,
                               area=MOD.area)

        # compute the obs that is not the mod
        data = (OBS.data.mask == 0) * (MOD.data.mask == 1)
        obs_not_mod = Variable(name="obs_not_mod",
                               unit="1",
                               data=np.ma.masked_values(zones == 1,
                                                        0).astype(float),
                               lat=lat,
                               lon=lon,
                               area=OBS.area)

        # compute the mod that is not the obs
        data = (OBS.data.mask == 1) * (MOD.data.mask == 0)
        mod_not_obs = Variable(name="mod_not_obs",
                               unit="1",
                               data=np.ma.masked_values(zones == 2,
                                                        0).astype(float),
                               lat=lat,
                               lon=lon,
                               area=MOD.area)

        # compute the mod that is not the obs but because of land representation
        data = (OBS.data.mask == 1) * (MOD.data.mask == 0)
        mod_not_obs_land = Variable(name="mod_not_obs_land",
                                    unit="1",
                                    data=np.ma.masked_values(zones == 3,
                                                             0).astype(float),
                                    lat=lat,
                                    lon=lon,
                                    area=MOD.area)

        # compute areas
        obs_and_mod_area = obs_and_mod.integrateInSpace().convert("1e6 km2")
        obs_not_mod_area = obs_not_mod.integrateInSpace().convert("1e6 km2")
        mod_not_obs_area = mod_not_obs.integrateInSpace().convert("1e6 km2")
        mod_not_obs_land_area = mod_not_obs_land.integrateInSpace().convert(
            "1e6 km2")

        # determine score
        obs_score = Variable(name="Missed Score global",
                             unit="1",
                             data=obs_and_mod_area.data /
                             (obs_and_mod_area.data + obs_not_mod_area.data))
        mod_score = Variable(name="Excess Score global",
                             unit="1",
                             data=obs_and_mod_area.data /
                             (obs_and_mod_area.data + mod_not_obs_area.data))

        # Write to datafiles --------------------------------------

        obs_area.name = "Total Area"
        mod_area.name = "Total Area"
        obs_and_mod_area.name = "Overlap Area"
        obs_not_mod_area.name = "Missed Area"
        mod_not_obs_area.name = "Excess Area"
        mod_not_obs_land_area.name = "Excess Area (Land Representation)"

        results = Dataset("%s/%s_%s.nc" %
                          (self.output_path, self.name, m.name),
                          mode="w")
        results.setncatts({"name": m.name, "color": m.color})
        mod.toNetCDF4(results, group="MeanState")
        obs_and_mod.toNetCDF4(results, group="MeanState")
        obs_not_mod.toNetCDF4(results, group="MeanState")
        mod_not_obs.toNetCDF4(results, group="MeanState")
        mod_not_obs_land.toNetCDF4(results, group="MeanState")
        mod_area.toNetCDF4(results, group="MeanState")
        obs_and_mod_area.toNetCDF4(results, group="MeanState")
        obs_not_mod_area.toNetCDF4(results, group="MeanState")
        mod_not_obs_area.toNetCDF4(results, group="MeanState")
        mod_not_obs_land_area.toNetCDF4(results, group="MeanState")
        obs_score.toNetCDF4(results, group="MeanState")
        mod_score.toNetCDF4(results, group="MeanState")
        results.close()

        if self.master:
            results = Dataset("%s/%s_Benchmark.nc" %
                              (self.output_path, self.name),
                              mode="w")
            results.setncatts({
                "name": "Benchmark",
                "color": np.asarray([0.5, 0.5, 0.5])
            })
            obs_area.toNetCDF4(results, group="MeanState")
            results.close()
コード例 #2
0
    def confront(self, m):

        obs, mod = self.stageData(m)
        obs_area = obs.integrateInSpace().convert("1e6 km2")
        mod_area = mod.integrateInSpace().convert("1e6 km2")

        # interpolate to a composed grid
        lat, lon = il.ComposeSpatialGrids(obs, mod)
        iobs = obs.interpolate(lat=lat, lon=lon)
        imod = mod.interpolate(lat=lat, lon=lon)

        # compute the intersection of obs and mod
        data = (iobs.data.mask == 0) * (imod.data.mask == 0)
        obs_and_mod = Variable(name="obs_and_mod",
                               unit="1",
                               data=np.ma.masked_values(data, 0).astype(float),
                               lat=lat,
                               lon=lon)

        # compute the obs that is not the mod
        data = (iobs.data.mask == 0) * (imod.data.mask == 1)
        obs_not_mod = Variable(name="obs_not_mod",
                               unit="1",
                               data=np.ma.masked_values(data, 0).astype(float),
                               lat=lat,
                               lon=lon)

        # compute the mod that is not the obs
        data = (iobs.data.mask == 1) * (imod.data.mask == 0)
        mod_not_obs = Variable(name="mod_not_obs",
                               unit="1",
                               data=np.ma.masked_values(data, 0).astype(float),
                               lat=lat,
                               lon=lon)

        # compute areas
        obs_and_mod_area = obs_and_mod.integrateInSpace().convert("1e6 km2")
        obs_not_mod_area = obs_not_mod.integrateInSpace().convert("1e6 km2")
        mod_not_obs_area = mod_not_obs.integrateInSpace().convert("1e6 km2")

        # determine score
        obs_score = Variable(name="Obs Score global",
                             unit="1",
                             data=obs_and_mod_area.data / obs_area.data)
        mod_score = Variable(name="Mod Score global",
                             unit="1",
                             data=obs_and_mod_area.data / mod_area.data)

        # Write to datafiles --------------------------------------

        obs_area.name = "Total Area"
        mod_area.name = "Total Area"
        obs_and_mod_area.name = "Overlap Area"
        obs_not_mod_area.name = "Missed Area"
        mod_not_obs_area.name = "Excess Area"

        results = Dataset("%s/%s_%s.nc" %
                          (self.output_path, self.name, m.name),
                          mode="w")
        results.setncatts({"name": m.name, "color": m.color})
        mod.toNetCDF4(results, group="MeanState")
        obs_and_mod.toNetCDF4(results, group="MeanState")
        obs_not_mod.toNetCDF4(results, group="MeanState")
        mod_not_obs.toNetCDF4(results, group="MeanState")
        mod_area.toNetCDF4(results, group="MeanState")
        obs_and_mod_area.toNetCDF4(results, group="MeanState")
        obs_not_mod_area.toNetCDF4(results, group="MeanState")
        mod_not_obs_area.toNetCDF4(results, group="MeanState")
        obs_score.toNetCDF4(results, group="MeanState")
        mod_score.toNetCDF4(results, group="MeanState")
        results.close()

        if self.master:
            results = Dataset("%s/%s_Benchmark.nc" %
                              (self.output_path, self.name),
                              mode="w")
            results.setncatts({
                "name": "Benchmark",
                "color": np.asarray([0.5, 0.5, 0.5])
            })
            obs_area.toNetCDF4(results, group="MeanState")
            results.close()