UFO
GaussianThinning.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2019 Met Office UK
3  *
4  * This software is licensed under the terms of the Apache Licence Version 2.0
5  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6  */
7 
8 #ifndef TEST_UFO_GAUSSIANTHINNING_H_
9 #define TEST_UFO_GAUSSIANTHINNING_H_
10 
11 #include <iomanip>
12 #include <memory>
13 #include <string>
14 #include <vector>
15 
16 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
17 
18 #include "eckit/config/LocalConfiguration.h"
19 #include "eckit/testing/Test.h"
20 #include "ioda/ObsSpace.h"
21 #include "ioda/ObsVector.h"
22 #include "oops/mpi/mpi.h"
23 #include "oops/runs/Test.h"
24 #include "oops/util/Expect.h"
25 #include "test/TestEnvironment.h"
27 #include "ufo/filters/Variables.h"
28 
29 namespace ufo {
30 namespace test {
31 
32 void testGaussianThinning(const eckit::LocalConfiguration &conf) {
33  util::DateTime bgn(conf.getString("window begin"));
34  util::DateTime end(conf.getString("window end"));
35 
36  const eckit::LocalConfiguration obsSpaceConf(conf, "obs space");
37  ioda::ObsSpace obsspace(obsSpaceConf, oops::mpi::world(), bgn, end, oops::mpi::myself());
38 
39  if (conf.has("air_pressures")) {
40  const std::vector<float> air_pressures = conf.getFloatVector("air_pressures");
41  obsspace.put_db("MetaData", "air_pressure", air_pressures);
42  const std::vector<float> air_pressure_obserrors(air_pressures.size(), 1.0f);
43  obsspace.put_db("ObsError", "air_pressure", air_pressure_obserrors);
44  }
45 
46  if (conf.has("category")) {
47  const std::vector<int> categories = conf.getIntVector("category");
48  obsspace.put_db("MetaData", "category", categories);
49  }
50 
51  if (conf.has("priority")) {
52  const std::vector<int> priorities = conf.getIntVector("priority");
53  obsspace.put_db("MetaData", "priority", priorities);
54  }
55 
56  std::shared_ptr<ioda::ObsDataVector<float>> obserr(new ioda::ObsDataVector<float>(
57  obsspace, obsspace.obsvariables(), "ObsError"));
58  std::shared_ptr<ioda::ObsDataVector<int>> qcflags(new ioda::ObsDataVector<int>(
59  obsspace, obsspace.obsvariables()));
60 
61  const eckit::LocalConfiguration filterConf(conf, "GaussianThinning");
62  ufo::Gaussian_Thinning filter(obsspace, filterConf, qcflags, obserr);
63  filter.preProcess();
64 
65  const std::vector<size_t> expectedThinnedObsIndices =
66  conf.getUnsignedVector("expected_thinned_obs_indices");
67  std::vector<size_t> thinnedObsIndices;
68  for (size_t i = 0; i < qcflags->nlocs(); ++i)
69  if ((*qcflags)[0][i] == ufo::QCflags::thinned)
70  thinnedObsIndices.push_back(i);
71  EXPECT_EQUAL(thinnedObsIndices.size(), expectedThinnedObsIndices.size());
72  const bool equal = std::equal(thinnedObsIndices.begin(), thinnedObsIndices.end(),
73  expectedThinnedObsIndices.begin());
74  EXPECT(equal);
75 }
76 
77 class GaussianThinning : public oops::Test {
78  private:
79  std::string testid() const override {return "ufo::test::GaussianThinning";}
80 
81  void register_tests() const override {
82  std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
83 
84  const eckit::LocalConfiguration conf(::test::TestEnvironment::config());
85  for (const std::string & testCaseName : conf.keys())
86  {
87  const eckit::LocalConfiguration testCaseConf(::test::TestEnvironment::config(), testCaseName);
88  ts.emplace_back(CASE("ufo/GaussianThinning/" + testCaseName, testCaseConf)
89  {
90  testGaussianThinning(testCaseConf);
91  });
92  }
93  }
94 
95  void clear() const override {}
96 };
97 
98 } // namespace test
99 } // namespace ufo
100 
101 #endif // TEST_UFO_GAUSSIANTHINNING_H_
ufo::test::GaussianThinning::testid
std::string testid() const override
Definition: GaussianThinning.h:79
ufo::test::GaussianThinning
Definition: GaussianThinning.h:77
ufo::test::CASE
CASE("ufo/MetOfficeBuddyPairFinder/" "Duplicates, constraints on buddy counts, legacy pair collector")
Definition: test/ufo/MetOfficeBuddyPairFinder.h:171
ufo::FilterBase::preProcess
void preProcess()
Definition: FilterBase.cc:66
ufo::Gaussian_Thinning
Group observations into grid cells and preserve only one observation in each cell.
Definition: Gaussian_Thinning.h:59
ufo
Definition: RunCRTM.h:27
Gaussian_Thinning.h
Variables.h
ufo::test::GaussianThinning::clear
void clear() const override
Definition: GaussianThinning.h:95
ufo::test::GaussianThinning::register_tests
void register_tests() const override
Definition: GaussianThinning.h:81
ufo::QCflags::thinned
constexpr int thinned
Definition: QCflags.h:21
ioda::ObsDataVector
Definition: BackgroundCheck.h:26
ufo::test::testGaussianThinning
void testGaussianThinning(const eckit::LocalConfiguration &conf)
Definition: GaussianThinning.h:32
conf
Definition: conf.py:1