14 #include "eckit/config/Configuration.h"
16 #include "ioda/ObsDataVector.h"
17 #include "ioda/ObsSpace.h"
18 #include "oops/util/abor1_cpp.h"
19 #include "oops/util/IntSetParser.h"
20 #include "oops/util/Logger.h"
21 #include "oops/util/missingValues.h"
35 if (
config_.has(
"test variables")) {
36 std::vector<eckit::LocalConfiguration> testvarconf;
37 config_.get(
"test variables", testvarconf);
51 std::vector<std::vector<bool>> & flagged)
const {
53 const oops::Variables observed =
obsdb_.obsvariables();
58 if (
config_.has(
"test variables")) {
59 std::vector<eckit::LocalConfiguration> varconfs;
60 config_.get(
"test variables", varconfs);
69 if (filtervars.
nvars() == 0) {
70 oops::Log::error() <<
"No variables will be filtered out in filter "
72 ABORT(
"No variables specified to be filtered out in filter");
76 << testvars << std::endl;
79 << testvars.
size() << std::endl;
82 std::vector<size_t> filt2obs;
83 for (
size_t jv = 0; jv < filtervars.
nvars(); ++jv) {
87 if (filtervars.
size() == testvars.
size()) {
89 for (
size_t iv = 0; iv < testvars.
size(); ++iv) {
90 const std::string grp = testvars[iv].group();
92 if (grp ==
"ObsFunction") {
95 for (
size_t ii = 0; ii < testvars[iv].
size(); ++ii) {
96 size_t kv = ii + iv * testvars[iv].
size();
101 std::vector<size_t> test_jv(filtervars[iv].size(), 0);
102 if (testvars[iv].size() == filtervars[iv].size()) {
103 std::iota(test_jv.begin(), test_jv.end(), 0);
107 for (
size_t jv = 0; jv < filtervars[iv].
size(); ++jv) {
108 for (
size_t jobs = 0; jobs <
obsdb_.nlocs(); ++jobs) {
110 ASSERT(testdata[test_jv[jv]][jobs] !=
missing);
111 size_t kv = jv + filtervars[iv].
size() * iv;
112 if (vmin !=
missing && testdata[test_jv[jv]][jobs] < vmin) flagged[kv][jobs] =
true;
113 if (vmax !=
missing && testdata[test_jv[jv]][jobs] > vmax) flagged[kv][jobs] =
true;
120 if (testvars.
size() != 1) {
121 oops::Log::error() <<
"When number filtervars not equal number of test vars, "
122 <<
"the latter can only be one." <<
config_ << std::endl;
123 ABORT(
"ONLY one testvar when filtervars>1 because its usage is ambiguous otherwise");
128 const std::string grp = testvars[iv].group();
130 if (grp ==
"ObsFunction") {
136 for (
size_t jv = 0; jv < filtervars.
size(); ++jv) {
137 oops::Log::debug() <<
"ObsBoundsCheck: testing filter var with index " << jv << std::endl;
138 if (testvars[iv].size() != filtervars[jv].size()) {
139 oops::Log::error() <<
"Dimension of filtervar, " << filtervars[jv].
size()
140 <<
" does not equal testvar dimension, " << testvars[iv].
size() << std::endl;
141 ABORT(
"Aborting, sizes must be equivalent.");
143 for (
size_t jobs = 0; jobs <
obsdb_.nlocs(); ++jobs) {
145 ASSERT(testdata[iv][jobs] !=
missing);
146 if (vmin !=
missing && testdata[iv][jobs] < vmin) flagged[jv][jobs] =
true;
147 if (vmax !=
missing && testdata[iv][jobs] > vmax) flagged[jv][jobs] =
true;
157 os <<
"ObsBoundsCheck: config = " <<
config_ << std::endl;