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::ObsTopLevelParameters obsParams;
37 obsParams.validateAndDeserialize(obsSpaceConf);
38 ioda::ObsSpace obsspace(obsParams, oops::mpi::world(), bgn, end, oops::mpi::myself());
40 if (conf.has(
"air_pressures")) {
41 const std::vector<float> air_pressures = conf.getFloatVector(
"air_pressures");
42 obsspace.put_db(
"MetaData",
"air_pressure", air_pressures);
43 const std::vector<float> air_pressure_obserrors(air_pressures.size(), 1.0f);
44 obsspace.put_db(
"ObsError",
"air_pressure", air_pressure_obserrors);
47 if (conf.has(
"min_vertical_spacing")) {
48 const std::vector<float> min_vertical_spacing = conf.getFloatVector(
"min_vertical_spacing");
49 obsspace.put_db(
"MetaData",
"min_vertical_spacing", min_vertical_spacing);
52 if (conf.has(
"category")) {
53 const std::vector<int> categories = conf.getIntVector(
"category");
54 obsspace.put_db(
"MetaData",
"category", categories);
57 if (conf.has(
"string_category")) {
58 const std::vector<std::string> categories = conf.getStringVector(
"string_category");
59 obsspace.put_db(
"MetaData",
"string_category", categories);
62 if (conf.has(
"priority")) {
63 const std::vector<int> priorities = conf.getIntVector(
"priority");
64 obsspace.put_db(
"MetaData",
"priority", priorities);
68 obsspace, obsspace.obsvariables(),
"ObsError"));
70 obsspace, obsspace.obsvariables()));
72 eckit::LocalConfiguration filterConf(conf,
"Poisson Disk Thinning");
74 filterParameters.validateAndDeserialize(filterConf);
76 if (expectValidationError) {
77 EXPECT_THROWS(filter.preProcess());
83 const std::vector<size_t> expectedThinnedObsIndices =
84 conf.getUnsignedVector(
"expected_thinned_obs_indices");
85 std::vector<size_t> thinnedObsIndices;
86 for (
size_t i = 0; i < qcflags->nlocs(); ++i)
88 thinnedObsIndices.push_back(i);
89 EXPECT_EQUAL(thinnedObsIndices, expectedThinnedObsIndices);
92 CASE(
"ufo/PoissonDiskThinning/No thinning") {
97 CASE(
"ufo/PoissonDiskThinning/"
98 "Horizontal thinning, min spacing smaller than nearest neighbor spacing") {
100 "Horizontal thinning, min spacing "
101 "smaller than nearest neighbor spacing"));
104 CASE(
"ufo/PoissonDiskThinning/"
105 "Horizontal thinning, min spacing larger than nearest neighbor spacing") {
107 "Horizontal thinning, min spacing "
108 "larger than nearest neighbor spacing"));
111 CASE(
"ufo/PoissonDiskThinning/"
112 "Vertical thinning, min spacing smaller than nearest neighbor spacing") {
114 "Vertical thinning, min spacing "
115 "smaller than nearest neighbor spacing"));
118 CASE(
"ufo/PoissonDiskThinning/"
119 "Vertical thinning, min spacing larger than nearest neighbor spacing") {
121 "Vertical thinning, min spacing "
122 "larger than nearest neighbor spacing"));
125 CASE(
"ufo/PoissonDiskThinning/Vertical thinning, where clause") {
127 "Vertical thinning, where clause"));
130 CASE(
"ufo/PoissonDiskThinning/"
131 "Time thinning, min spacing equal to nearest neighbor spacing") {
133 "Time thinning, min spacing "
134 "equal to nearest neighbor spacing"));
137 CASE(
"ufo/PoissonDiskThinning/"
138 "Time thinning, min spacing larger than nearest neighbor spacing") {
140 "Time thinning, min spacing "
141 "larger than nearest neighbor spacing"));
144 CASE(
"ufo/PoissonDiskThinning/"
145 "Horizontal and vertical thinning, min spacing larger than nearest neighbor spacing") {
147 "Horizontal and vertical thinning, min spacing "
148 "larger than nearest neighbor spacing"));
151 CASE(
"ufo/PoissonDiskThinning/"
152 "Horizontal and time thinning, min spacing larger than nearest neighbor spacing") {
154 "Horizontal and time thinning, min spacing "
155 "larger than nearest neighbor spacing"));
158 CASE(
"ufo/PoissonDiskThinning/"
159 "Vertical and time thinning, min spacing larger than nearest neighbor spacing") {
161 "Vertical and time thinning, min spacing "
162 "larger than nearest neighbor spacing"));
165 CASE(
"ufo/PoissonDiskThinning/"
166 "Horizontal, vertical and time thinning, min spacing larger than nearest neighbor spacing") {
168 "Horizontal, vertical and time thinning, min "
169 "spacing larger than nearest neighbor spacing"));
172 CASE(
"ufo/PoissonDiskThinning/Priorities") {
177 CASE(
"ufo/PoissonDiskThinning/Int-valued categories") {
179 "Int-valued categories"));
182 CASE(
"ufo/PoissonDiskThinning/String-valued categories") {
184 "String-valued categories"));
187 CASE(
"ufo/PoissonDiskThinning/Variable min spacings") {
189 "Variable min spacings"));
192 CASE(
"ufo/PoissonDiskThinning/Variable min spacings, shuffling") {
194 "Variable min spacings, shuffling"));
197 CASE(
"ufo/PoissonDiskThinning/Cylindrical exclusion volumes") {
199 "Cylindrical exclusion volumes"));
202 CASE(
"ufo/PoissonDiskThinning/Ellipsoidal exclusion volumes") {
204 "Ellipsoidal exclusion volumes"));
207 CASE(
"ufo/PoissonDiskThinning/Incorrectly ordered min horizontal spacings") {
209 "Incorrectly ordered min horizontal spacings"),
213 CASE(
"ufo/PoissonDiskThinning/Incorrectly ordered min vertical spacings") {
215 "Incorrectly ordered min vertical spacings"),
219 CASE(
"ufo/PoissonDiskThinning/Incorrectly ordered min time spacings") {
221 "Incorrectly ordered min time spacings"),
227 std::string
testid()
const override {
return "ufo::test::PoissonDiskThinning";}
Thins observations by iterating over them in random order and retaining each observation lying outsid...
Options controlling the operation of the PoissonDiskThinning filter.
void clear() const override
std::string testid() const override
void register_tests() const override
CASE("ufo/DataExtractor/bilinearinterp/float_linear")
void testPoissonDiskThinning(const eckit::LocalConfiguration &conf, bool expectValidationError=false)