18 #include "eckit/config/Configuration.h"
20 #include "ioda/ObsDataVector.h"
21 #include "ioda/ObsSpace.h"
23 #include "oops/util/abor1_cpp.h"
24 #include "oops/util/IntSetParser.h"
25 #include "oops/util/Logger.h"
37 :
FilterBase(obsdb, parameters, flags, obserr), parameters_(parameters)
39 oops::Log::trace() <<
"BackgroundCheck constructor" << std::endl;
71 oops::Log::trace() <<
"BackgroundCheck destructed" << std::endl;
86 std::vector<std::vector<bool>> & flagged)
const {
87 oops::Log::trace() <<
"BackgroundCheck postFilter" << std::endl;
88 const oops::Variables observed =
obsdb_.obsvariables();
102 data_.
get(rtvar, function_abs_threshold);
104 for (
size_t jv = 0; jv < filtervars.
nvars(); ++jv) {
107 std::vector<float> hofx;
109 for (
size_t jobs = 0; jobs <
obsdb_.nlocs(); ++jobs) {
111 (*
obserr_)[iv][jobs] != util::missingValue((*
obserr_)[iv][jobs])) {
112 ASSERT(obs[jv][jobs] != util::missingValue(obs[jv][jobs]));
113 ASSERT(hofx[jobs] != util::missingValue(hofx[jobs]));
116 float zz = function_abs_threshold[jv][jobs];
118 if (
std::abs(
static_cast<float>(hofx[jobs]) - obs[jv][jobs]) > zz) {
119 flagged[jv][jobs] =
true;
126 for (
size_t jv = 0; jv < filtervars.
nvars(); ++jv) {
129 std::vector<float> hofx;
132 std::vector<float> hofxerr;
134 if (thresholdWrtBGerror) {
139 std::vector<float> bias(
obsdb_.nlocs(), 0.0);
145 std::vector<float> abs_thr(
obsdb_.nlocs(), std::numeric_limits<float>::max());
146 std::vector<float> thr(
obsdb_.nlocs(), std::numeric_limits<float>::max());
152 for (
size_t jobs = 0; jobs <
obsdb_.nlocs(); ++jobs) {
154 (*
obserr_)[iv][jobs] != util::missingValue((*
obserr_)[iv][jobs])) {
155 ASSERT(obs[jv][jobs] != util::missingValue(obs[jv][jobs]));
156 ASSERT(hofx[jobs] != util::missingValue(hofx[jobs]));
157 ASSERT(bias[jobs] != util::missingValue(bias[jobs]));
159 const std::vector<float> &errorMultiplier = thresholdWrtBGerror ?
160 hofxerr : (*obserr_)[iv];
162 float zz = (thr[jobs] == std::numeric_limits<float>::max()) ? abs_thr[jobs] :
163 std::min(abs_thr[jobs], thr[jobs] * errorMultiplier[jobs]);
165 ASSERT(zz < std::numeric_limits<float>::max() && zz > 0.0);
171 if (
std::abs(hofx[jobs] - obs[jv][jobs] - bias[jobs]) > zz) {
172 flagged[jv][jobs] =
true;
183 os <<
"BackgroundCheck::print not yet implemented ";
void applyFilter(const std::vector< bool > &, const Variables &, std::vector< std::vector< bool >> &) const override
Variable backgrErrVariable(const Variable &filterVariable) const
Return the name of the variable containing the background error estimate of the specified filter vari...
BackgroundCheck(ioda::ObsSpace &, const Parameters_ &, std::shared_ptr< ioda::ObsDataVector< int > >, std::shared_ptr< ioda::ObsDataVector< float > >)
void print(std::ostream &) const override
Parameters controlling the operation of the BackgroundCheck filter.
oops::OptionalParameter< std::string > absoluteThreshold
oops::Parameter< std::string > test_hofx
Name of the HofX group used to replace the default group (default is HofX)
oops::Parameter< bool > removeBiasCorrection
The filter uses bias-corrected H(x) unless remove bias correction is set to true.
oops::OptionalParameter< std::string > threshold
oops::Parameter< bool > thresholdWrtBGerror
oops::OptionalParameter< std::vector< Variable > > functionAbsoluteThreshold
Base class for UFO QC filters.
ufo::Variables filtervars_
void get(const Variable &varname, std::vector< float > &values) const
Fills a std::vector with values of the specified variable.
std::shared_ptr< ioda::ObsDataVector< float > > obserr_
std::shared_ptr< ioda::ObsDataVector< int > > flags_
const std::string & variable() const
oops::Variables toOopsVariables() const
size_t nvars() const
Return the number of constituent "primitive" (single-channel) variables.
Variable variable(const size_t) const
Return a given constituent "primitive" (single-channel) variable.
oops::Variables toOopsVariables() const
size_t size() const
Return the number of constituent Variable objects (some of which may contain multiple channels).
util::Duration abs(const util::Duration &duration)
std::vector< float > getScalarOrFilterData(const std::string &strfactor, const ObsFilterData &data)
Function to fill in a vector with either a scalar or data from ObsFilterData.