コード例 #1
0
 def test_invalid_arguments(self):
     points = titanlib.Points(lats, lons, elevs)
     N = 3
     args0 = [points, values, num_min, num_max, inner_radius,
             outer_radius, num_iterations, num_min_prof, min_elev_diff, min_horizontal_scale,
             vertical_scale, pos, neg, eps2]
     invalid_arguments = [(2, -1), (3, -1), (4, -1000),
                          (5, -1000), (6, -1), (7, -1), (8, -1), (9, -1),
                          (10, -1), (11, [-1] * N), (12, [-1] * N), (13, [-1] * N), (13, [0] * N)]
     for invalid_argument in invalid_arguments:
         with self.subTest(argument=invalid_argument[0]):
             with self.assertRaises(ValueError):
                 args = args0
                 args[invalid_argument[0]] = invalid_argument[1]
                 titanlib.sct(*args)
コード例 #2
0
ファイル: sct_test.py プロジェクト: alira303/titanlib
    def test_simple(self):
        elevs0 = [0, 0, 0]
        values0 = [0, 1, 100]
        points0 = titanlib.Points(lats, lons, elevs0)

        flags, sct, rep = titanlib.sct(points0, values0, num_min, num_max, inner_radius,
                outer_radius, num_iterations, num_min_prof, min_elev_diff, min_horizontal_scale,
                vertical_scale, pos, neg, eps2)
        np.testing.assert_array_equal(flags, [0, 0, 1])
コード例 #3
0
    def test_obs_to_check(self):
        elevs0 = [0, 0, 0, 0, 0, 0]
        values0 = [0, 1, 1, 1, 100, 100]
        points0 = titanlib.Points(lats*2, lons*2, elevs0)
        obs_to_check0 = [0, 1, 1, 1, 1, 0]

        flags, sct, rep = titanlib.sct(points0, values0, num_min, num_max, inner_radius,
                outer_radius, num_iterations, num_min_prof, min_elev_diff, min_horizontal_scale,
                vertical_scale, np.ones(6), np.ones(6), 0.5 * np.ones(6), obs_to_check0)
        np.testing.assert_array_equal(flags, [0, 0, 0, 0, 1, 0])
コード例 #4
0
 def test_valid_input(self):
     """Check that the test doesn't fail"""
     N = 100
     lats = np.random.randn(N) * 10000
     lons = np.random.randn(N) * 10000
     elevs = np.random.rand(N) * 100
     values = np.random.randn(N) * 6
     t2pos = np.ones(N) * 4
     t2neg = np.ones(N) * 4
     eps2 = np.ones(N) * 0.5
     sct, rep, flags = titanlib.sct(lats, lons, elevs, values, 100, 1000,
                                    100, 100, 10000, 100, t2pos, t2neg,
                                    eps2)
コード例 #5
0
ファイル: sct_test.py プロジェクト: alira303/titanlib
    def test_time(self):
        s_time = time.time()

        N = 3000
        lats = np.random.randn(N) * 1;
        lons = np.random.randn(N) * 1;
        elevs = np.random.rand(N) * 100;
        points = titanlib.Points(lats, lons, elevs)
        values = np.random.randn(N) * 6;
        pos = np.ones(N) * 4;
        neg = np.ones(N) * 4;
        eps2 = np.ones(N) * 0.5;
        flags, sct, rep = titanlib.sct(points, values, 5, 100, 4000, 10000, 2, 30, 100, 1000, 100, pos, neg, eps2)

        print("%.1fs" % (time.time() - s_time))
コード例 #6
0
    def test(self, dataset, mask, code=1):

        global_flags = dataset.flags
        proj = pyproj.Proj(
            "+proj=lcc +lat_0=63 +lon_0=15 +lat_1=63 +lat_2=63 +no_defs +R=6.371e+06"
        )
        x_proj = []
        y_proj = []
        elevs = []
        values = []
        for i in range(0, len(mask)):
            x_p, y_p = proj(dataset.lons[mask[i]], dataset.lats[mask[i]])
            x_proj.append(x_p)
            y_proj.append(y_p)
            if np.isnan(dataset.elevs[mask[i]]):
                elevs.append(0)
                print("WARNING: Should have beeen removed. Set elevation to 0")
            else:
                elevs.append(dataset.elevs[mask[i]])
            values.append(dataset.values[mask[i]] - 273.15)
            if np.isnan(x_p) or np.isnan(y_p) or np.isnan(dataset.elevs[mask[i]]) \
                    or np.isnan(dataset.values[mask[i]] - 273.15):
                print(x_p, y_p, dataset.elevs[mask[i]],
                      dataset.values[mask[i]] - 273.15)

        status, sct, flags = tit.sct(x_proj, y_proj, elevs, values, self.nmin,
                                     self.nmax, self.nminprof, self.dzmin,
                                     self.dhmin, self.dz, self.t2pos,
                                     self.t2neg, self.eps2)

        for i in range(0, len(mask)):
            if global_flags[mask[i]] == 0 and flags[i] == 1:
                global_flags[mask[i]] = code

        dataset.normalize_ci(mask, self.cmin, self.cmax)

        if self.debug:
            for i in range(0, len(mask)):
                print(self.name, i, mask[i], dataset.values[mask[i]], sct[i],
                      flags[i], global_flags[mask[i]])

        return global_flags
コード例 #7
0
 def test_nminprof(self):
     nminprof = 20
     sct, rep, flags = titanlib.sct(len100, len100, len100, z100, 100, 1000,
                                    nminprof, 100, 10000, 100, 2 * o100,
                                    2 * o100, 0.5 * o100)
コード例 #8
0
    def test(self, dataset, mask, code=105):

        if tit is None:
            raise ModuleNotFoundError("titanlib was not loaded properly")

        global_flags = dataset.flags
        lons = []
        lats = []
        elevs = []
        values = []

        old_mask = mask
        mask = []
        nmissing_elev = 0
        for i in range(0, len(old_mask)):
            if np.isnan(dataset.elevs[old_mask[i]]):
                if not self.missing_elev_to_zero:
                    ind = i - nmissing_elev
                    # print(i, old_mask[i], nmissing_elev, ind, len(self.pos))
                    self.pos.pop(ind)
                    self.neg.pop(ind)
                    self.eps2.pop(ind)
                else:
                    mask.append(old_mask[i])
                nmissing_elev = nmissing_elev + 1
            else:
                mask.append(old_mask[i])

        for i in range(0, len(mask)):
            lons.append(dataset.lons[mask[i]])
            lats.append(dataset.lats[mask[i]])
            if np.isnan(dataset.elevs[mask[i]] and self.missing_elev_to_zero):
                elevs.append(0)
            else:
                elevs.append(dataset.elevs[mask[i]])
            values.append(dataset.values[mask[i]])

            # DEBUG
            if np.isnan(dataset.lons[mask[i]]):
                print(i, "lon")
                raise Exception()

            if np.isnan(dataset.lats[mask[i]]):
                print(i, "lat")
                raise Exception

            if np.isnan(dataset.values[mask[i]]):
                print(i, "value")
                raise Exception

        if nmissing_elev > 0:
            if self.missing_elev_to_zero:
                print("Found " + str(nmissing_elev) + "/" + str(len(old_mask)) +
                      " observations with undefined elevations which were set to zero")
            else:
                print("Removed " + str(nmissing_elev) + "/" + str(len(old_mask)) +
                      " obsevations with undefined elevations")

        print("Running sct")
        if len(values) > 0:
            lats = np.asarray(lats)
            lons = np.asarray(lons)
            elevs = np.asarray(elevs)
            values = np.asarray(values)
            answer = tit.sct(lats, lons, elevs, values, self.num_min, self.num_max, self.inner_radius,
                             self.outer_radius, self.num_iterations, self.num_min_prof, self.min_elev_diff,
                             self.min_horizonal_scale, self.vertical_scale, self.pos, self.neg, self.eps2)

            flags = answer[0]
            sct = answer[1]
            rep = answer[2]
            for i in range(0, len(mask)):
                if int(global_flags[mask[i]]) == 0 and flags[i] == 1:
                    global_flags[mask[i]] = code

            dataset.normalize_ci(mask, self.cmin, self.cmax)

            if self.debug:
                for i in range(0, len(mask)):
                    print(self.name, i, mask[i], dataset.values[mask[i]], sct[i], rep[i], int(flags[i]),
                          int(global_flags[mask[i]]))
        else:
            print("No observations to run test on")

        return global_flags
コード例 #9
0
inner_radius = 50000
outer_radius = 100000
num_min = 5
num_max = 100
num_iterations = 1
num_min_prof = 20
dzmin = 100
dhmin = 10000
dz = 200
t2pos = np.full([len(obs)], 4)
t2neg = np.full([len(obs)], 4)
eps2 = np.full([len(obs)], 0.5)
print(t2pos.shape)

# Run the SCT
flags, sct, rep = titanlib.sct(obs_lats, obs_lons, obs_elevs, obs, num_min, num_max, inner_radius,
        outer_radius, num_iterations, num_min_prof, dzmin, dhmin , dz, t2pos, t2neg, eps2)

index_valid_obs = np.where(flags == 0)[0]
index_invalid_obs = np.where(flags != 0)[0]
print(index_invalid_obs)

# Plot the quality control results
import matplotlib.pylab as mpl
mpl.scatter(obs_lons[index_valid_obs], obs_lats[index_valid_obs],
        c=obs[index_valid_obs] - 273.15, s=50, linewidths=0, cmap="RdBu_r", vmin=5, vmax=20)
mpl.scatter(obs_lons[index_invalid_obs], obs_lats[index_invalid_obs],
        c=obs[index_invalid_obs] - 273.15, s=50, edgecolors="r", linewidths=1.5, cmap="RdBu_r",
        vmin=5, vmax=20)
mpl.xlim(0, 35)
mpl.ylim(55, 75)
mpl.gca().set_aspect(2)