UFO
test/ufo/StuckCheck.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2020 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_STUCKCHECK_H_
9 #define TEST_UFO_STUCKCHECK_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"
26 #include "ufo/filters/StuckCheck.h"
27 #include "ufo/filters/Variables.h"
28 
29 namespace ufo {
30 namespace test {
31 
32 void testStuckCheck(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::ObsTopLevelParameters obsParams;
38  obsParams.validateAndDeserialize(obsSpaceConf);
39  ioda::ObsSpace obsspace(obsParams, oops::mpi::world(), bgn, end, oops::mpi::myself());
40 
41  if (conf.has("air_temperatures")) {
42  const std::vector<float> airTemperatures = conf.getFloatVector("air_temperatures");
43  obsspace.put_db("ObsValue", "air_temperature", airTemperatures);
44  }
45 
46  if (conf.has("air_pressures")) {
47  const std::vector<float> airPressures = conf.getFloatVector("air_pressures");
48  obsspace.put_db("ObsValue", "air_pressure", airPressures);
49  }
50 
51  std::shared_ptr<ioda::ObsDataVector<float>> obserr(new ioda::ObsDataVector<float>(
52  obsspace, obsspace.obsvariables(), "ObsError"));
53  std::shared_ptr<ioda::ObsDataVector<int>> qcflags(new ioda::ObsDataVector<int>(
54  obsspace, obsspace.obsvariables()));
55 
56  eckit::LocalConfiguration filterConf(conf, "Stuck Check");
57  ufo::StuckCheckParameters filterParameters;
58  filterParameters.validateAndDeserialize(filterConf);
59  ufo::StuckCheck filter(obsspace, filterParameters, qcflags, obserr);
60  filter.preProcess();
61 
62  const std::vector<size_t> expectedRejectedObsIndices =
63  conf.getUnsignedVector("expected_rejected_obs_indices");
64  std::vector<size_t> rejectedObsIndices;
65  for (size_t i = 0; i < qcflags->nlocs(); ++i)
66  if ((*qcflags)[0][i] == ufo::QCflags::track)
67  rejectedObsIndices.push_back(i);
68  EXPECT_EQUAL(rejectedObsIndices, expectedRejectedObsIndices);
69 }
70 
71 class StuckCheck : public oops::Test {
72  private:
73  std::string testid() const override {return "ufo::test::StuckCheck";}
74 
75  void register_tests() const override {
76  std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
77 
78  const eckit::LocalConfiguration conf(::test::TestEnvironment::config());
79  for (const std::string & testCaseName : conf.keys())
80  {
81  const eckit::LocalConfiguration testCaseConf(::test::TestEnvironment::config(), testCaseName);
82  ts.emplace_back(CASE("ufo/StuckCheck/" + testCaseName, testCaseConf)
83  {
84  testStuckCheck(testCaseConf);
85  });
86  }
87  }
88 
89  void clear() const override {}
90 };
91 
92 } // namespace test
93 } // namespace ufo
94 
95 #endif // TEST_UFO_STUCKCHECK_H_
void preProcess() override
Options controlling the operation of stuck check filter.
std::string testid() const override
void clear() const override
void register_tests() const override
constexpr int track
Definition: QCflags.h:31
CASE("ufo/DataExtractor/bilinearinterp/float_linear")
void testStuckCheck(const eckit::LocalConfiguration &conf)
Definition: RunCRTM.h:27