UFO
test/ufo/MetOfficeBuddyCheck.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_METOFFICEBUDDYCHECK_H_
9 #define TEST_UFO_METOFFICEBUDDYCHECK_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 #include "ufo/Locations.h"
29 #include "ufo/ObsDiagnostics.h"
30 #include "ufo/utils/StringUtils.h"
31 
32 namespace ufo {
33 namespace test {
34 
35 void testMetOfficeBuddyCheck(const eckit::LocalConfiguration &conf) {
36  util::DateTime bgn(conf.getString("window begin"));
37  util::DateTime end(conf.getString("window end"));
38 
39  const eckit::LocalConfiguration obsSpaceConf(conf, "obs space");
40  ioda::ObsSpace obsSpace(obsSpaceConf, oops::mpi::world(), bgn, end, oops::mpi::myself());
41 
42  const eckit::LocalConfiguration floatVarInitConf(conf, "FloatVariables");
43  for (const std::string & varNameGroup : floatVarInitConf.keys()) {
44  std::string varName, varGroup;
45  ufo::splitVarGroup(varNameGroup, varName, varGroup);
46  const std::vector<float> values = floatVarInitConf.getFloatVector(varNameGroup);
47  obsSpace.put_db(varGroup, varName, values);
48  }
49 
50  const eckit::LocalConfiguration intVarInitConf(conf, "IntVariables");
51  for (const std::string & varNameGroup : intVarInitConf.keys()) {
52  std::string varName, varGroup;
53  ufo::splitVarGroup(varNameGroup, varName, varGroup);
54  const std::vector<int> values = intVarInitConf.getIntVector(varNameGroup);
55  obsSpace.put_db(varGroup, varName, values);
56  }
57 
58  std::shared_ptr<ioda::ObsDataVector<float>> obserr(new ioda::ObsDataVector<float>(
59  obsSpace, obsSpace.obsvariables(), "ObsError"));
60  std::shared_ptr<ioda::ObsDataVector<int>> qcflags(new ioda::ObsDataVector<int>(
61  obsSpace, obsSpace.obsvariables()));
62 
63  const eckit::LocalConfiguration filterConf(conf, "Met Office Buddy Check");
64  ufo::MetOfficeBuddyCheck filter(obsSpace, filterConf, qcflags, obserr);
65  filter.preProcess();
66 
67  ioda::ObsVector hofx(obsSpace, "HofX");
68  ufo::Locations locations(obsSpace, bgn, end);
69  ufo::ObsDiagnostics obsDiags(obsSpace, locations, oops::Variables());
70  filter.postFilter(hofx, obsDiags);
71 
72  const eckit::LocalConfiguration pgeConf(conf, "ExpectedGrossErrorProbabilities");
73  for (const std::string & varNameGroup : pgeConf.keys()) {
74  std::string varName, varGroup;
75  ufo::splitVarGroup(varNameGroup, varName, varGroup);
76  const std::vector<float> expectedPges = pgeConf.getFloatVector(varNameGroup);
77  std::vector<float> actualPges(obsSpace.nlocs());
78  obsSpace.get_db(varGroup, varName, actualPges);
79  EXPECT(oops::are_all_close_absolute(actualPges, expectedPges, 1e-6f));
80  }
81 }
82 
83 class MetOfficeBuddyCheck : public oops::Test {
84  private:
85  std::string testid() const override {return "ufo::test::MetOfficeBuddyCheck";}
86 
87  void register_tests() const override {
88  std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
89 
90  const eckit::LocalConfiguration conf(::test::TestEnvironment::config());
91  for (const std::string & testCaseName : conf.keys())
92  {
93  const eckit::LocalConfiguration testCaseConf(::test::TestEnvironment::config(), testCaseName);
94  ts.emplace_back(CASE("ufo/MetOfficeBuddyCheck/" + testCaseName, testCaseConf)
95  {
96  testMetOfficeBuddyCheck(testCaseConf);
97  });
98  }
99  }
100 
101  void clear() const override {}
102 };
103 
104 } // namespace test
105 } // namespace ufo
106 
107 #endif // TEST_UFO_METOFFICEBUDDYCHECK_H_
MetOfficeBuddyCheck.h
ufo::MetOfficeBuddyCheck
Met Office's implementation of the buddy check.
Definition: src/ufo/filters/MetOfficeBuddyCheck.h:67
ufo::test::CASE
CASE("ufo/MetOfficeBuddyPairFinder/" "Duplicates, constraints on buddy counts, legacy pair collector")
Definition: test/ufo/MetOfficeBuddyPairFinder.h:171
ufo::splitVarGroup
void splitVarGroup(const std::string &vargrp, std::string &var, std::string &grp)
Definition: StringUtils.cc:19
ufo::FilterBase::preProcess
void preProcess()
Definition: FilterBase.cc:66
ufo::Locations
Locations class to handle locations for UFO.
Definition: src/ufo/Locations.h:32
ufo
Definition: RunCRTM.h:27
ufo::test::MetOfficeBuddyCheck
Definition: test/ufo/MetOfficeBuddyCheck.h:83
Variables.h
ufo::test::MetOfficeBuddyCheck::clear
void clear() const override
Definition: test/ufo/MetOfficeBuddyCheck.h:101
ufo::ObsDiagnostics
Definition: src/ufo/ObsDiagnostics.h:35
ufo::FilterBase::postFilter
void postFilter(const ioda::ObsVector &, const ObsDiagnostics &)
Definition: FilterBase.cc:94
StringUtils.h
ufo::test::MetOfficeBuddyCheck::register_tests
void register_tests() const override
Definition: test/ufo/MetOfficeBuddyCheck.h:87
ioda::ObsDataVector
Definition: BackgroundCheck.h:26
ufo::test::MetOfficeBuddyCheck::testid
std::string testid() const override
Definition: test/ufo/MetOfficeBuddyCheck.h:85
ufo::test::testMetOfficeBuddyCheck
void testMetOfficeBuddyCheck(const eckit::LocalConfiguration &conf)
Definition: test/ufo/MetOfficeBuddyCheck.h:35
conf
Definition: conf.py:1