8 #ifndef TEST_UFO_GAUSSIANTHINNING_H_
9 #define TEST_UFO_GAUSSIANTHINNING_H_
16 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
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"
33 util::DateTime bgn(conf.getString(
"window begin"));
34 util::DateTime end(conf.getString(
"window end"));
36 const eckit::LocalConfiguration obsSpaceConf(conf,
"obs space");
37 ioda::ObsTopLevelParameters obsParams;
38 obsParams.validateAndDeserialize(obsSpaceConf);
39 ioda::ObsSpace obsspace(obsParams, oops::mpi::world(), bgn, end, oops::mpi::myself());
41 if (conf.has(
"air_pressures")) {
42 const std::vector<float> air_pressures = conf.getFloatVector(
"air_pressures");
43 obsspace.put_db(
"MetaData",
"air_pressure", air_pressures);
44 const std::vector<float> air_pressure_obserrors(air_pressures.size(), 1.0f);
45 obsspace.put_db(
"ObsError",
"air_pressure", air_pressure_obserrors);
48 if (conf.has(
"category")) {
49 const std::vector<int> categories = conf.getIntVector(
"category");
50 obsspace.put_db(
"MetaData",
"category", categories);
53 if (conf.has(
"string_category")) {
54 const std::vector<std::string> categories = conf.getStringVector(
"string_category");
55 obsspace.put_db(
"MetaData",
"string_category", categories);
58 if (conf.has(
"priority")) {
59 const std::vector<int> priorities = conf.getIntVector(
"priority");
60 obsspace.put_db(
"MetaData",
"priority", priorities);
64 obsspace, obsspace.obsvariables(),
"ObsError"));
66 obsspace, obsspace.obsvariables()));
68 eckit::LocalConfiguration filterConf(conf,
"GaussianThinning");
70 std::string expectedMessage;
71 if (conf.get(
"on_deserialization_expect_exception_with_message", expectedMessage)) {
72 EXPECT_THROWS_MSG(filterParameters.validateAndDeserialize(filterConf), expectedMessage.c_str());
75 filterParameters.validateAndDeserialize(filterConf);
81 const std::vector<size_t> expectedThinnedObsIndices =
82 conf.getUnsignedVector(
"expected_thinned_obs_indices");
83 std::vector<size_t> thinnedObsIndices;
84 for (
size_t i = 0; i < qcflags->nlocs(); ++i)
86 thinnedObsIndices.push_back(i);
87 EXPECT_EQUAL(thinnedObsIndices.size(), expectedThinnedObsIndices.size());
88 const bool equal = std::equal(thinnedObsIndices.begin(), thinnedObsIndices.end(),
89 expectedThinnedObsIndices.begin());
95 std::string
testid()
const override {
return "ufo::test::GaussianThinning";}
98 std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
100 const eckit::LocalConfiguration conf(::test::TestEnvironment::config());
101 for (
const std::string & testCaseName : conf.keys())
103 const eckit::LocalConfiguration testCaseConf(::test::TestEnvironment::config(), testCaseName);
104 ts.emplace_back(
CASE(
"ufo/GaussianThinning/" + testCaseName, testCaseConf)
Group observations into grid cells and preserve only one observation in each cell.
Options controlling the operation of the Gaussian_Thinning filter.
void preProcess() override
void register_tests() const override
std::string testid() const override
void clear() const override
void testGaussianThinning(const eckit::LocalConfiguration &conf)
CASE("ufo/DataExtractor/bilinearinterp/float_linear")