8 #ifndef TEST_UFO_METOFFICEBUDDYCHECK_H_
9 #define TEST_UFO_METOFFICEBUDDYCHECK_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"
28 #include "ufo/Locations.h"
29 #include "ufo/ObsDiagnostics.h"
36 util::DateTime bgn(conf.getString(
"window begin"));
37 util::DateTime end(conf.getString(
"window end"));
39 const eckit::LocalConfiguration obsSpaceConf(conf,
"obs space");
40 ioda::ObsTopLevelParameters obsParams;
41 obsParams.validateAndDeserialize(obsSpaceConf);
42 ioda::ObsSpace obsSpace(obsParams, oops::mpi::world(), bgn, end, oops::mpi::myself());
44 const eckit::LocalConfiguration floatVarInitConf(conf,
"FloatVariables");
45 for (
const std::string & varNameGroup : floatVarInitConf.keys()) {
46 std::string varName, varGroup;
48 const std::vector<float> values = floatVarInitConf.getFloatVector(varNameGroup);
49 obsSpace.put_db(varGroup, varName, values);
52 const eckit::LocalConfiguration intVarInitConf(conf,
"IntVariables");
53 for (
const std::string & varNameGroup : intVarInitConf.keys()) {
54 std::string varName, varGroup;
56 const std::vector<int> values = intVarInitConf.getIntVector(varNameGroup);
57 obsSpace.put_db(varGroup, varName, values);
61 obsSpace, obsSpace.obsvariables(),
"ObsError"));
63 obsSpace, obsSpace.obsvariables()));
65 eckit::LocalConfiguration filterConf(conf,
"Met Office Buddy Check");
67 filterParameters.validateAndDeserialize(filterConf);
71 ioda::ObsVector hofx(obsSpace,
"HofX");
73 ioda::ObsVector bias(obsSpace);
77 const eckit::LocalConfiguration diagConf = conf.getSubConfiguration(
"obs diagnostics");
78 oops::Variables diagVars;
79 for (
const std::string &name : diagConf.keys())
80 diagVars.push_back(name);
83 for (
const std::string &name : diagConf.keys()) {
84 const std::vector<double> diag = diagConf.getDoubleVector(name);
85 obsDiags.
save(diag, name, 0);
90 const eckit::LocalConfiguration pgeConf(conf,
"ExpectedGrossErrorProbabilities");
91 for (
const std::string & varNameGroup : pgeConf.keys()) {
92 std::string varName, varGroup;
94 const std::vector<float> expectedPges = pgeConf.getFloatVector(varNameGroup);
95 std::vector<float> actualPges(obsSpace.nlocs());
96 obsSpace.get_db(varGroup, varName, actualPges);
97 EXPECT(oops::are_all_close_absolute(actualPges, expectedPges, 1e-6f));
103 std::string
testid()
const override {
return "ufo::test::MetOfficeBuddyCheck";}
106 std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
108 const eckit::LocalConfiguration conf(::test::TestEnvironment::config());
109 for (
const std::string & testCaseName : conf.keys())
111 const eckit::LocalConfiguration testCaseConf(::test::TestEnvironment::config(), testCaseName);
112 ts.emplace_back(
CASE(
"ufo/MetOfficeBuddyCheck/" + testCaseName, testCaseConf)
Locations class to handle simple lat-lon-time locations.
Met Office's implementation of the buddy check.
Options controlling the operation of the MetOfficeBuddyCheck filter.
void allocate(const int nlev, const oops::Variables &vars)
Allocate diagnostics for variables vars with nlev number of levels.
void save(const std::vector< double > &, const std::string &, const int)
void postFilter(const ioda::ObsVector &, const ioda::ObsVector &, const ObsDiagnostics &) override
void preProcess() override
void register_tests() const override
void clear() const override
std::string testid() const override
CASE("ufo/DataExtractor/bilinearinterp/float_linear")
void testMetOfficeBuddyCheck(const eckit::LocalConfiguration &conf)
void splitVarGroup(const std::string &vargrp, std::string &var, std::string &grp)