12 const std::vector<float> &obsVal,
13 const std::vector<float> &obsErr,
14 const std::vector<float> &bkgVal,
15 const std::vector<float> &bkgErr,
16 const std::vector<float> &PdBad,
17 const bool ModelLevels,
18 std::vector<int> &flags,
19 std::vector<float> &PGE,
20 std::vector<float> &PGEBd,
22 const std::vector<float> *obsVal2,
23 const std::vector<float> *bkgVal2)
25 const float missingValueFloat = util::missingValue(1.0f);
27 const double PGEMult = 1000.0;
29 const double PGEMDI = 1.111;
39 const double SDiffCrit = obsVal2 && bkgVal2 ?
43 const size_t numLocs = obsVal.size();
46 PGEBd.assign(obsVal.size(), PGEMDI);
57 const bool obsErrEmpty = obsErr.empty();
58 const bool bkgErrEmpty = bkgErr.empty();
60 for (
size_t jloc = 0; jloc < numLocs; ++jloc) {
62 if (!obsErrEmpty && !bkgErrEmpty &&
63 obsErr[jloc] >= 0 && bkgErr[jloc] >= 0) {
64 ErrVar = std::pow(ObErrMult * obsErr[jloc], 2) +
65 std::pow(BkgErrMult * bkgErr[jloc], 2);
67 ErrVar = missingValueFloat;
70 if (ErrVarMax > 0.0) {
71 ErrVar = std::min(ErrVar, ErrVarMax);
75 if (obsVal[jloc] != missingValueFloat &&
76 bkgVal[jloc] != missingValueFloat &&
77 ErrVar != missingValueFloat) {
78 if (obsVal2 && bkgVal2 &&
79 (*obsVal2)[jloc] != missingValueFloat &&
80 (*bkgVal2)[jloc] != missingValueFloat) {
81 SDiff = (std::pow(obsVal[jloc] - bkgVal[jloc], 2) +
82 std::pow((*obsVal2)[jloc] - (*bkgVal2)[jloc], 2)) /
static_cast<double>(ErrVar);
84 PdGood = std::exp(-0.5 * std::min(SDiff, 2.0 * ExpArgMax)) / (2.0 * M_PI * ErrVar);
86 SDiff = std::pow(obsVal[jloc] - bkgVal[jloc], 2) / ErrVar;
88 PdGood = std::exp(-0.5 * std::min(SDiff, 2.0 * ExpArgMax)) /
89 std::sqrt(2.0 * M_PI * ErrVar);
93 PGEBk = (PdBad[jloc] * PGE[jloc]) /
94 (PdBad[jloc] * PGE[jloc] + PdGood * (1.0 - PGE[jloc]));
98 if (PGEBk >= PGECrit) {
108 PGE[jloc] = trunc(PGEBk * PGEMult) + PGE[jloc];
112 (SDiff >= SDiffCrit ||
Options controlling the operation of the calculations involving probability of gross error.
oops::Parameter< float > PGE_BkgErrMult
Multiplication factor for background errors.
oops::Parameter< float > PGE_PGECrit
PGE rejection limit.
oops::Parameter< float > PGE_SDiffCrit
Critical value for squared difference from background / ErrVar.
oops::Parameter< float > PGE_ExpArgMax
Maximum value of exponent in background QC.
oops::Parameter< float > PGE_ObErrMult
Multiplication factor for observation errors.
@ FinalRejectFlag
Final QC flag.
@ BackPerfFlag
Background check performed.
@ BackRejectFlag
PGE>0.5 after backgr check.
@ PermRejectFlag
Blacklisted data.
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)