14 #include <boost/make_unique.hpp>
16 #include "eckit/exception/Exceptions.h"
17 #include "ioda/ObsSpace.h"
18 #include "oops/util/AssociativeContainers.h"
27 const float fmiss = util::missingValue(fmiss);
28 const double dmiss = util::missingValue(dmiss);
29 const size_t numLocs = input.nlocs();
30 const size_t numInputVars = input.nvars();
31 const size_t numOutputVars = output.nvars();
32 for (
size_t inputVarIndex = 0; inputVarIndex < numInputVars; ++inputVarIndex) {
33 const ioda::ObsDataRow<float> &inputVarValues = input[inputVarIndex];
34 const size_t outputVarIndex = output.varnames().find(input.varnames()[inputVarIndex]);
35 for (
size_t locIndex = 0; locIndex < numLocs; ++locIndex) {
36 const float value = inputVarValues[locIndex];
37 output[locIndex * numOutputVars + outputVarIndex] =
38 (value == fmiss) ? dmiss :
static_cast<double>(value);
44 if (vars.channels().empty()) {
45 return std::set<std::string>(vars.variables().begin(), vars.variables().end());
48 ASSERT(vars.channels().size() == vars.variables().size());
49 std::string channellessVariable = vars.variables().front();
50 channellessVariable.resize(channellessVariable.find_last_of(
'_'));
51 return std::set<std::string>{channellessVariable};
60 const oops::Variables & vars)
66 throw eckit::UserError(
"'" + varParams.name.value() +
67 "' is not in the list of bias-corrected variables", Here());
68 eckit::LocalConfiguration varConfig = varParams.details.toConfiguration();
69 varConfig.set(
"group",
"ObsBias");
70 obsFunctions_[varParams.name] = boost::make_unique<DrawValueFromFile<float>>(varConfig);
84 ioda::ObsVector & out)
const {
92 const std::string &varName = varAndObsFunction.first;
95 oops::Variables currentVars({varName},
vars_.channels());
97 obsFunction.
compute(obsFilterData, obsFunctionResult);
98 save(obsFunctionResult, out);
const ufo::Variables & requiredVariables() const
geovals required to compute the function
void compute(const ObsFilterData &, ioda::ObsDataVector< T > &) const
compute the result of the function
GeoVaLs: geophysical values at locations.
void compute(const ioda::ObsSpace &, const GeoVaLs &, const ObsDiagnostics &, ioda::ObsVector &) const override
compute the predictor
std::map< std::string, std::unique_ptr< DrawValueFromFile< float > > > obsFunctions_
InterpolateDataFromFile(const Parameters_ &, const oops::Variables &)
Configuration parameters of the interpolate_data_from_file predictor.
oops::Parameter< std::vector< VariableCorrectionParameters > > correctedVariables
ObsFilterData provides access to all data related to an ObsFilter.
void associate(const GeoVaLs &)
Associates GeoVaLs with this ObsFilterData.
oops::Variables vars_
variables that will be bias-corrected using this predictor
oops::Variables geovars_
required GeoVaLs
oops::Variables hdiags_
required ObsDiagnostics
oops::Variables toOopsVariables() const
Variables allFromGroup(const std::string &) const
std::set< std::string > getVariableNamesWithoutChannels(const oops::Variables &vars)
void save(const ioda::ObsDataVector< float > &input, ioda::ObsVector &output)
Store all components of input in output.
bool contains(const std::set< T > &set, const T &element)
static ObsOperatorMaker< ObsBackgroundErrorIdentity > maker("BackgroundErrorIdentity")