8 #ifndef TEST_UFO_POISSONDISKTHINNING_H_
9 #define TEST_UFO_POISSONDISKTHINNING_H_
16 #include "eckit/config/LocalConfiguration.h"
17 #include "eckit/testing/Test.h"
18 #include "ioda/ObsSpace.h"
19 #include "ioda/ObsVector.h"
20 #include "oops/mpi/mpi.h"
21 #include "oops/runs/Test.h"
22 #include "oops/util/Expect.h"
23 #include "test/TestEnvironment.h"
31 bool expectValidationError =
false) {
32 util::DateTime bgn(
conf.getString(
"window begin"));
33 util::DateTime end(
conf.getString(
"window end"));
35 const eckit::LocalConfiguration obsSpaceConf(
conf,
"obs space");
36 ioda::ObsSpace obsspace(obsSpaceConf, oops::mpi::world(), bgn, end, oops::mpi::myself());
38 if (
conf.has(
"air_pressures")) {
39 const std::vector<float> air_pressures =
conf.getFloatVector(
"air_pressures");
40 obsspace.put_db(
"MetaData",
"air_pressure", air_pressures);
41 const std::vector<float> air_pressure_obserrors(air_pressures.size(), 1.0f);
42 obsspace.put_db(
"ObsError",
"air_pressure", air_pressure_obserrors);
45 if (
conf.has(
"min_vertical_spacing")) {
46 const std::vector<float> min_vertical_spacing =
conf.getFloatVector(
"min_vertical_spacing");
47 obsspace.put_db(
"MetaData",
"min_vertical_spacing", min_vertical_spacing);
50 if (
conf.has(
"category")) {
51 const std::vector<int> categories =
conf.getIntVector(
"category");
52 obsspace.put_db(
"MetaData",
"category", categories);
55 if (
conf.has(
"priority")) {
56 const std::vector<int> priorities =
conf.getIntVector(
"priority");
57 obsspace.put_db(
"MetaData",
"priority", priorities);
61 obsspace, obsspace.obsvariables(),
"ObsError"));
63 obsspace, obsspace.obsvariables()));
65 const eckit::LocalConfiguration filterConf(
conf,
"Poisson Disk Thinning");
67 if (expectValidationError) {
74 const std::vector<size_t> expectedThinnedObsIndices =
75 conf.getUnsignedVector(
"expected_thinned_obs_indices");
76 std::vector<size_t> thinnedObsIndices;
77 for (
size_t i = 0; i < qcflags->nlocs(); ++i)
79 thinnedObsIndices.push_back(i);
80 EXPECT_EQUAL(thinnedObsIndices, expectedThinnedObsIndices);
83 CASE(
"ufo/PoissonDiskThinning/No thinning") {
88 CASE(
"ufo/PoissonDiskThinning/"
89 "Horizontal thinning, min spacing smaller than nearest neighbor spacing") {
91 "Horizontal thinning, min spacing "
92 "smaller than nearest neighbor spacing"));
95 CASE(
"ufo/PoissonDiskThinning/"
96 "Horizontal thinning, min spacing larger than nearest neighbor spacing") {
98 "Horizontal thinning, min spacing "
99 "larger than nearest neighbor spacing"));
102 CASE(
"ufo/PoissonDiskThinning/"
103 "Vertical thinning, min spacing smaller than nearest neighbor spacing") {
105 "Vertical thinning, min spacing "
106 "smaller than nearest neighbor spacing"));
109 CASE(
"ufo/PoissonDiskThinning/"
110 "Vertical thinning, min spacing larger than nearest neighbor spacing") {
112 "Vertical thinning, min spacing "
113 "larger than nearest neighbor spacing"));
116 CASE(
"ufo/PoissonDiskThinning/Vertical thinning, where clause") {
118 "Vertical thinning, where clause"));
121 CASE(
"ufo/PoissonDiskThinning/"
122 "Time thinning, min spacing equal to nearest neighbor spacing") {
124 "Time thinning, min spacing "
125 "equal to nearest neighbor spacing"));
128 CASE(
"ufo/PoissonDiskThinning/"
129 "Time thinning, min spacing larger than nearest neighbor spacing") {
131 "Time thinning, min spacing "
132 "larger than nearest neighbor spacing"));
135 CASE(
"ufo/PoissonDiskThinning/"
136 "Horizontal and vertical thinning, min spacing larger than nearest neighbor spacing") {
138 "Horizontal and vertical thinning, min spacing "
139 "larger than nearest neighbor spacing"));
142 CASE(
"ufo/PoissonDiskThinning/"
143 "Horizontal and time thinning, min spacing larger than nearest neighbor spacing") {
145 "Horizontal and time thinning, min spacing "
146 "larger than nearest neighbor spacing"));
149 CASE(
"ufo/PoissonDiskThinning/"
150 "Vertical and time thinning, min spacing larger than nearest neighbor spacing") {
152 "Vertical and time thinning, min spacing "
153 "larger than nearest neighbor spacing"));
156 CASE(
"ufo/PoissonDiskThinning/"
157 "Horizontal, vertical and time thinning, min spacing larger than nearest neighbor spacing") {
159 "Horizontal, vertical and time thinning, min "
160 "spacing larger than nearest neighbor spacing"));
163 CASE(
"ufo/PoissonDiskThinning/Priorities") {
168 CASE(
"ufo/PoissonDiskThinning/Categories") {
173 CASE(
"ufo/PoissonDiskThinning/Variable min spacings") {
175 "Variable min spacings"));
178 CASE(
"ufo/PoissonDiskThinning/Variable min spacings, shuffling") {
180 "Variable min spacings, shuffling"));
183 CASE(
"ufo/PoissonDiskThinning/Cylindrical exclusion volumes") {
185 "Cylindrical exclusion volumes"));
188 CASE(
"ufo/PoissonDiskThinning/Ellipsoidal exclusion volumes") {
190 "Ellipsoidal exclusion volumes"));
193 CASE(
"ufo/PoissonDiskThinning/Incorrectly ordered min horizontal spacings") {
195 "Incorrectly ordered min horizontal spacings"),
199 CASE(
"ufo/PoissonDiskThinning/Incorrectly ordered min vertical spacings") {
201 "Incorrectly ordered min vertical spacings"),
205 CASE(
"ufo/PoissonDiskThinning/Incorrectly ordered min time spacings") {
207 "Incorrectly ordered min time spacings"),
213 std::string
testid()
const override {
return "ufo::test::PoissonDiskThinning";}
223 #endif // TEST_UFO_POISSONDISKTHINNING_H_