UFO
AssignError.cc
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2019 UCAR
3  *
4  * This software is licensed under the terms of the Apache Licence Version 2.0
5  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6  */
7 
9 
10 #include <algorithm>
11 #include <set>
12 
13 #include "ioda/ObsDataVector.h"
14 #include "oops/base/Variables.h"
15 #include "oops/util/IntSetParser.h"
16 #include "oops/util/missingValues.h"
18 #include "ufo/filters/QCflags.h"
19 #include "ufo/utils/StringUtils.h"
20 
21 namespace ufo {
22 
23 // -----------------------------------------------------------------------------
24 
26 
27 // -----------------------------------------------------------------------------
28 
29 AssignError::AssignError(const eckit::Configuration & conf)
30  : allvars_(), conf_(conf) {
31  if (conf_.has("error function")) {
32  allvars_ += Variable(conf_.getSubConfiguration("error function"));
33  }
34  ASSERT(conf_.has("error function") || conf_.has("error parameter"));
35 }
36 
37 // -----------------------------------------------------------------------------
38 
39 void AssignError::apply(const Variables & vars,
40  const std::vector<std::vector<bool>> &,
41  const ObsFilterData & data,
43  ioda::ObsDataVector<float> & obserr) const {
44  oops::Log::debug() << " AssignError input obserr: " << obserr << std::endl;
45  const float missing = util::missingValue(missing);
46  // If float error is specified
47  if (conf_.has("error parameter")) {
48  float error = conf_.getFloat("error parameter");
49  for (size_t jv = 0; jv < vars.nvars(); ++jv) {
50  size_t iv = obserr.varnames().find(vars.variable(jv).variable());
51  size_t kv = flags.varnames().find(vars.variable(jv).variable());
52  for (size_t jobs = 0; jobs < obserr.nlocs(); ++jobs) {
53  if (flags[kv][jobs] == QCflags::pass) obserr[iv][jobs] = error;
54  }
55  }
56  // If variable is specified
57  } else if (conf_.has("error function")) {
58  Variable errorvar(conf_.getSubConfiguration("error function"));
59  ASSERT(errorvar.size() == 1 || errorvar.size() == vars.nvars());
60  ioda::ObsDataVector<float> errors(data.obsspace(), errorvar.toOopsVariables(),
61  errorvar.group(), false);
62  data.get(errorvar, errors);
63 
64  // if assigned error function is 1D variable, apply the same error to all variables
65  // error_jv = {0, 0, 0, ..., 0} for all nvars
66  std::vector<size_t> error_jv(vars.nvars(), 0);
67  // if multiple variables are in the assigned error function, apply different error to different
68  // variables
69  // error_jv = {0, 1, 2, ..., nvars-1}
70  if (errorvar.size() == vars.nvars()) {
71  std::iota(error_jv.begin(), error_jv.end(), 0);
72  }
73 
74  // loop over all variables to update
75  for (size_t jv = 0; jv < vars.nvars(); ++jv) {
76  // find current variable index in obserr
77  size_t iv = obserr.varnames().find(vars.variable(jv).variable());
78  size_t kv = flags.varnames().find(vars.variable(jv).variable());
79  for (size_t jobs = 0; jobs < obserr.nlocs(); ++jobs) {
80  if (flags[kv][jobs] == QCflags::pass && errors[error_jv[jv]][jobs] != missing)
81  obserr[iv][jobs] = errors[error_jv[jv]][jobs];
82  }
83  }
84  }
85  oops::Log::debug() << " AssignError output obserr: " << obserr << std::endl;
86 }
87 
88 // -----------------------------------------------------------------------------
89 
90 } // namespace ufo
ufo::Variables::nvars
size_t nvars() const
Definition: Variables.cc:104
ufo::QCflags::pass
constexpr int pass
Definition: QCflags.h:14
ufo::Variables
Definition: src/ufo/filters/Variables.h:24
ufo_radiancerttov_utils_mod::debug
logical, public debug
Definition: ufo_radiancerttov_utils_mod.F90:100
ufo::ObsFilterData::obsspace
ioda::ObsSpace & obsspace() const
Returns reference to ObsSpace associated with ObsFilterData.
Definition: src/ufo/filters/ObsFilterData.h:84
ufo::Variable::size
size_t size() const
Definition: Variable.cc:79
ufo::Variable::toOopsVariables
oops::Variables toOopsVariables() const
Definition: Variable.cc:129
AssignError.h
ufo
Definition: RunCRTM.h:27
ufo::AssignError::AssignError
AssignError(const eckit::Configuration &)
Definition: AssignError.cc:29
ufo::QCflags::missing
constexpr int missing
Definition: QCflags.h:15
ufo::FilterActionMaker
Definition: FilterActionBase.h:60
QCflags.h
ufo::Variable::group
const std::string & group() const
Definition: Variable.cc:117
ufo::Variable::variable
const std::string & variable() const
Definition: Variable.cc:100
ufo::makerAssignErr_
static FilterActionMaker< AssignError > makerAssignErr_("assign error")
StringUtils.h
ioda::ObsDataVector< int >
ufo::AssignError::allvars_
Variables allvars_
Definition: AssignError.h:33
ufo::AssignError::conf_
const eckit::LocalConfiguration conf_
Definition: AssignError.h:35
ufo::Variables::variable
Variable variable(const size_t) const
Definition: Variables.cc:114
ObsFilterData.h
ufo::ObsFilterData::get
void get(const Variable &, std::vector< float > &) const
Gets requested data from ObsFilterData.
Definition: ObsFilterData.cc:130
ufo::Variable
Definition: Variable.h:23
ufo::ObsFilterData
ObsFilterData provides access to all data related to an ObsFilter.
Definition: src/ufo/filters/ObsFilterData.h:40
conf
Definition: conf.py:1
ufo::AssignError::apply
void apply(const Variables &, const std::vector< std::vector< bool >> &, const ObsFilterData &, ioda::ObsDataVector< int > &, ioda::ObsDataVector< float > &) const override
compute the diagnostic
Definition: AssignError.cc:39