18 #include "ioda/ObsDataVector.h"
19 #include "ioda/ObsSpace.h"
21 #include "oops/util/Logger.h"
35 ioda::ObsSpace & obsdb,
39 :
FilterBase(obsdb, parameters, flags, obserr), parameters_(parameters)
41 oops::Log::trace() <<
"BayesianBackgroundCheck constructor" << std::endl;
52 oops::Log::trace() <<
"BayesianBackgroundCheck destructed" << std::endl;
68 const std::vector<size_t> &j_reduced)
const {
69 size_t reduced_size = j_reduced.size();
70 std::vector<T> vector_reduced(reduced_size);
71 for (
size_t i_reduced=0; i_reduced < reduced_size; ++i_reduced) {
72 vector_reduced[i_reduced] = vector_full[j_reduced[i_reduced]];
74 return vector_reduced;
82 std::vector<T> &vector_full,
83 const std::vector<size_t> &j_reduced)
const {
84 size_t reduced_size = vector_reduced.size();
85 for (
size_t i_reduced=0; i_reduced < reduced_size; ++i_reduced) {
86 vector_full[j_reduced[i_reduced]] = vector_reduced[i_reduced];
95 std::vector<std::vector<bool>> & flagged)
const {
96 oops::Log::trace() <<
"BayesianBackgroundCheck postFilter" << std::endl;
97 const oops::Variables observed =
obsdb_.obsvariables();
109 const bool ModelLevels =
false;
111 bool previousVariableWasFirstComponentOfTwo =
false;
112 bool thisVariableIsFirstComponentOfTwo =
false;
117 for (
size_t filterVarIndex = 0; filterVarIndex < filtervars.
size(); ++filterVarIndex) {
118 if (filtervars[filterVarIndex].options().getBool(
"first_component_of_two",
false)) {
119 previousVariableWasFirstComponentOfTwo =
true;
121 std::string varname1, varname2;
124 std::vector<float> hofx1, hofx2;
126 std::vector<float> hofxerr;
131 std::vector<float> PGEBd1(
obsdb_.nlocs());
133 std::vector<int> qcflags1(
obsdb_.nlocs());
134 std::vector<float> firstComponentObVal, secondComponentObVal;
136 std::vector<bool> applycondition(
obsdb_.nlocs(),
false);
138 std::vector<size_t> j_reduced;
140 if (previousVariableWasFirstComponentOfTwo) {
143 iv1 = observed.find(varname1);
144 iv2 = observed.find(varname2);
149 firstComponentObVal = obs[filterVarIndex-1];
150 secondComponentObVal = obs[filterVarIndex];
152 if (
obsdb_.has(
"QCFlags", varname1)) {
156 for (
size_t jobs=0; jobs <
obsdb_.nlocs(); ++jobs) {
159 applycondition[jobs] =
true;
160 j_reduced.push_back(jobs);
165 iv1 = observed.find(varname1);
169 firstComponentObVal = obs[filterVarIndex];
171 if (
obsdb_.has(
"QCFlags", varname1)) {
175 for (
size_t jobs=0; jobs <
obsdb_.nlocs(); ++jobs) {
177 applycondition[jobs] =
true;
178 j_reduced.push_back(jobs);
184 std::vector<float> firstComponentObVal_reduced =
reduceVector(firstComponentObVal,
187 std::vector<float> hofx1_reduced =
reduceVector(hofx1, j_reduced);
188 std::vector<float> hofxerr_reduced =
reduceVector(hofxerr, j_reduced);
189 std::vector<float> PdBad_reduced =
reduceVector(PdBad, j_reduced);
190 std::vector<int> qcflags1_reduced =
reduceVector(qcflags1, j_reduced);
191 std::vector<float> PGE1_reduced =
reduceVector(PGE1, j_reduced);
192 std::vector<float> PGEBd1_reduced =
reduceVector(PGEBd1, j_reduced);
193 std::vector<float> secondComponentObVal_reduced;
194 std::vector<float> hofx2_reduced;
195 if (previousVariableWasFirstComponentOfTwo) {
196 secondComponentObVal_reduced =
reduceVector(secondComponentObVal, j_reduced);
201 firstComponentObVal_reduced,
211 previousVariableWasFirstComponentOfTwo?
212 &secondComponentObVal_reduced :
nullptr,
213 previousVariableWasFirstComponentOfTwo?
214 &hofx2_reduced :
nullptr);
221 obsdb_.put_db(
"GrossErrorProbabilityTotal", varname1, PGE1);
222 obsdb_.put_db(
"GrossErrorProbabilityBuddyCheck", varname1, PGEBd1);
224 obsdb_.put_db(
"QCFlags", varname1, qcflags1);
226 if (previousVariableWasFirstComponentOfTwo) {
228 std::vector<float> &PGE2 = PGE1;
230 std::vector<float> &PGEBd2 = PGEBd1;
231 obsdb_.put_db(
"GrossErrorProbabilityTotal", varname2, PGE2);
232 obsdb_.put_db(
"GrossErrorProbabilityBuddyCheck", varname2, PGEBd2);
234 std::vector<int> &qcflags2 = qcflags1;
235 obsdb_.put_db(
"QCFlags", varname2, qcflags2);
237 for (
size_t jobs=0; jobs <
obsdb_.nlocs(); ++jobs) {
239 flagged[filterVarIndex-1][jobs] =
true;
242 flagged[filterVarIndex][jobs] =
true;
245 << flagged[filterVarIndex-1][jobs] << std::endl;
247 << flagged[filterVarIndex][jobs] << std::endl;
251 for (
size_t jobs=0; jobs <
obsdb_.nlocs(); ++jobs) {
253 flagged[filterVarIndex][jobs] =
true;
256 << flagged[filterVarIndex][jobs] << std::endl;
259 previousVariableWasFirstComponentOfTwo =
false;
267 os <<
"BayesianBackgroundCheck: config = " <<
parameters_ << std::endl;
std::vector< T > reduceVector(const std::vector< T > &vector_full, const std::vector< size_t > &j_reduced) const
Reduce a vector to only the elements for which j_reduced=true.
void applyFilter(const std::vector< bool > &apply, const Variables &filtervars, std::vector< std::vector< bool >> &flagged) const override
Apply Bayesian background check filter. Return flagged=true for rejected obs.
void unreduceVector(const std::vector< T > &vector_reduced, std::vector< T > &vector_full, const std::vector< size_t > &j_reduced) const
Copy a reduced vector back into the correct indices of the full vector.
Variable backgrErrVariable(const Variable &filterVariable) const
Return the name of the variable containing the background error estimate of the specified filter vari...
void print(std::ostream &) const override
~BayesianBackgroundCheck()
BayesianBackgroundCheck(ioda::ObsSpace &obsdb, const Parameters_ ¶meters, std::shared_ptr< ioda::ObsDataVector< int > > flags, std::shared_ptr< ioda::ObsDataVector< float > > obserr)
Parameters controlling the operation of the BayesianBackgroundCheck filter.
oops::RequiredParameter< float > PGE
ProbabilityOfGrossErrorParameters PGEParameters
Parameters related to PGE calculations.
oops::RequiredParameter< float > PdBad
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
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).
@ BackRejectFlag
PGE>0.5 after backgr check.
void BayesianPGEUpdate(const ProbabilityOfGrossErrorParameters &options, const std::vector< float > &obsVal, const std::vector< float > &obsErr, const std::vector< float > &bkgVal, const std::vector< float > &bkgErr, const std::vector< float > &PdBad, const bool ModelLevels, std::vector< int > &flags, std::vector< float > &PGE, std::vector< float > &PGEBd, float ErrVarMax, const std::vector< float > *obsVal2, const std::vector< float > *bkgVal2)
Bayesian update of probability of gross error (PGE)